system.argumentnullexception值不能为null

时间:2018-11-29 16:24:34

标签: c#

我尝试使用此查询进行过滤器api服务

create proc usp_filter
@name VARCHAR(50),
@lastname VARCHAR(50),
@pass VARCHAR(50)
as
begin
SELECT * FROM tb_users
WHERE
(name = @name OR @name is null) AND
(lastname = @lastname OR @lastname is null) AND
(pass = @pass OR @pass is null)
end 
go

从表格中过滤数据,但是如果需要,它可以忽略一些或所有参数。

因此,当我在c#中发送参数时,如果输入了所有参数,它只会返回列表,以防万一我想发送空参数时会在控制器中生成该错误

  

类型为“ System.ArgumentNullException”的异常发生在   System.Core.dll,但未在用户代码中处理。

     

其他信息:该值不能为null。

我尝试使用DbNull处理此错误,但出现相同的错误

这是我的方法

public List<User> Filter(string name, string lastname, string pass)
        {
            List<User> users = null;
            cnx.Open();
            string sqlStatement = "usp_filter";
            SqlCommand cmd = new SqlCommand(sqlStatement, cnx);
            cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@name", name ?? Convert.DBNull);

               cmd.Parameters.AddWithValue("@lastname", lastname ?? Convert.DBNull);

             cmd.Parameters.AddWithValue("@pass", pass ?? Convert.DBNull);

            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.HasRows)
            {
                users = new List<User>();
                while (reader.Read())
                {
                    User user = new User();
                    user.id = int.Parse(reader["id"].ToString());
                    user.name= reader["name"].ToString();
                    user.lastName= reader["lastname"].ToString();
                    user.address= reader["address"].ToString();
                    user.email = reader["email"].ToString();
                    user.pass= reader["pass"].ToString();
                    users.Add(user);
                }
            }
            cnx.Close();
            return users;
        }

这就是我在控制器中处理它的方式。

 [HttpGet]
        public User Filter(string name,string lastname,string pass)
        {
            var list = business.Filter(name,lastname,pass);
            User user = list.Where(x => x.name == name && x.lastname == lastname && x.pass == pass).SingleOrDefault();

            return user;
        }

编辑例外https://i.stack.imgur.com/HKBrU.png

1 个答案:

答案 0 :(得分:0)

您在proc上输入的参数必须可为空。这会起作用。

@name VARCHAR(50)= NULL,
@lastname VARCHAR(50)= NULL,
@pass VARCHAR(50)= NULL

.net中也有对象提供空值,因此您可以更改Convert.DBNullSystem.Data.SqlTypes.SqlString.Null

string不能为null,因此合并将不起作用(??)。最好将它们写为:

cmd.Parameters.AddWithValue("@name", string.IsNullOrEmpty(name) ?
    System.Data.SqlTypes.SqlString.Null : name);
cmd.Parameters.AddWithValue("@lastname", string.IsNullOrEmpty(lastname) ?
    System.Data.SqlTypes.SqlString.Null : lastname);
cmd.Parameters.AddWithValue("@pass", string.IsNullOrEmpty(pass) ?
    System.Data.SqlTypes.SqlString.Null : pass);