C# sql wcf 参数异常

C# sql wcf parametres exception

这可能是我的第一个 C# 程序,所以请耐心等待。 我正在尝试按照在线教程创建一个 adds/deletes/updates 来自本地 MS Sql 数据库的学生数据的应用程序。

数据库-本地 windows 使用 table 注册调用的身份验证: 主键 - UserId int 用户名 varchar (100) 密码 varchar (20) 国家/地区 varchar (100) 电子邮件 varchar (20)

该程序使用 WCF 服务并正确启动,但是当我尝试调用 InsertUserDetails() 时,我一直收到错误消息。

错误文本: 参数化查询“(@UserID int,@UserName nvarchar(4000),@Password nvarchar(4000),@”需要未提供的参数“@UserName”

Service1.cs 的 C# 代码:

public class Service1 : IService1
{

    public DataSet SelectUserDetails()
    {

        SqlConnection con = new SqlConnection(@"Server=Robert;Database=Trying;Trusted_Connection=True;");

        con.Open();

        SqlCommand cmd = new SqlCommand("Select * from Registration", con);

        SqlDataAdapter sda = new SqlDataAdapter(cmd);

        DataSet ds = new DataSet();

        sda.Fill(ds);

        cmd.ExecuteNonQuery();

        con.Close();

        return ds;

    }



    public void UpdateRegistrationTable(UserDetails userInfo)
    {

        SqlConnection con = new SqlConnection(@"Server=Robert;Database=Trying;Trusted_Connection=True;");

        con.Open();

        SqlCommand cmd = new SqlCommand("update Registration set UserName=@UserName,Password=@Password,Country=@Country, Email=@Email where UserID=@UserID", con);



        cmd.Parameters.AddWithValue("@UserName", userInfo.UserName);

        cmd.Parameters.AddWithValue("@Password", userInfo.Password);

        cmd.Parameters.AddWithValue("@Country", userInfo.Country);

        cmd.Parameters.AddWithValue("@Email", userInfo.Email);

        cmd.ExecuteNonQuery();

        con.Close();

    }



    public bool DeleteUserDetails(UserDetails userInfo)
    {

        SqlConnection con = new SqlConnection(@"Server=Robert;Database=Trying;Trusted_Connection=True;");

        con.Open();

        SqlCommand cmd = new SqlCommand("delete from Registration where UserID=@UserID", con);

        cmd.Parameters.AddWithValue("@UserID", userInfo.UserID);

        cmd.ExecuteNonQuery();

        con.Close();

        return true;

    }



    public string InsertUserDetails(UserDetails userInfo)
    {

        string Message;

        SqlConnection con = new SqlConnection(@"Server=Robert;Database=Trying;Trusted_Connection=True;");

        con.Open();

        SqlCommand cmd = new SqlCommand("insert into Registration(UserID,UserName,Password,Country,Email) values(@UserID,@UserName,@Password,@Country,@Email)", con);

        cmd.Parameters.AddWithValue("@UserID", userInfo.UserID);  
        cmd.Parameters.AddWithValue("@UserName", userInfo.UserName);           
        cmd.Parameters.AddWithValue("@Password", userInfo.Password);
        cmd.Parameters.AddWithValue("@Country", userInfo.Country);
        cmd.Parameters.AddWithValue("@Email", userInfo.Email);

        int result = cmd.ExecuteNonQuery();

        if (result == 1)
        {

            Message = userInfo.UserName + " Details inserted successfully";

        }

        else
        {

            Message = userInfo.UserName + " Details not inserted successfully";

        }

        con.Close();

        return Message;

    }

}

}

我的 C# 代码Service1.cs

 [ServiceContract]

public interface IService1
{

    [OperationContract]

    string InsertUserDetails(UserDetails userInfo);



    [OperationContract]

    DataSet SelectUserDetails();



    [OperationContract]

    bool DeleteUserDetails(UserDetails userInfo);



    [OperationContract]

    void UpdateRegistrationTable(UserDetails userInfo);

}



// Use a data contract as illustrated in the sample below to add composite types to service operations.

[DataContract]

public class UserDetails
{

    int userid;

    string username;

    string password;

    string country;

    string email;



    [DataMember]

    public int UserID
    {

        get { return userid; }

        set { userid = value; }

    }



    [DataMember]

    public string UserName
    {

        get { return username; }

        set { username = value; }

    }

    [DataMember]

    public string Password
    {

        get { return password; }

        set { password = value; }

    }

    [DataMember]

    public string Country
    {

        get { return country; }

        set { country = value; }

    }

    [DataMember]

    public string Email
    {

        get { return email; }

        set { email = value; }

    }

}

}

这意味着你的 UserDetails class 的 UserName 属性 似乎是 null。检查它是否有值。

减轻此类错误的一种方法是通过指定插入方法的 contract 来提前检查 UserDetails 实例的有效性。

public string InsertUserDetails(UserDetails userInfo)
{

  if(null==userInfo)
    throw new Exception("userInfo is null");

  if(String.IsNullOrEmpty(userInfo.UserName))
    throw new Exception("UserName is null or empty");

  // and only after this check succeeds do the insert

}

如果要允许空值,则必须将 .NET NULL 转换为 ado.NET DBNull.Value

cmd.Parameters.AddWithValue("@UserName", userInfo.UserName ?? DBNull.Value);

另一种可能的解决方案是将 SQL 包装在过程中,并通过提供默认参数使参数可为空。

create procedure usp_InserProc @UserName varchar(32) = NULL
begin
   ... sql code
end