我尝试使用此查询进行过滤器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;
}
答案 0 :(得分:0)
您在proc上输入的参数必须可为空。这会起作用。
@name VARCHAR(50)= NULL,
@lastname VARCHAR(50)= NULL,
@pass VARCHAR(50)= NULL
.net中也有对象提供空值,因此您可以更改Convert.DBNull
到System.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);