【发布时间】:2021-11-28 06:26:13
【问题描述】:
我正在开发一个在 ASP.NET Web 应用程序(框架 4.8)中进行用户管理的项目。在代码中创建了搜索框,我希望能够在其中搜索名称、员工编号以及它们是否被排除。我将它用作过滤器,因此我不需要滚动浏览 gridview 中的所有页面。我在查询中尝试了一些更改,但似乎没有什么不同。我对这类 SQL 查询不是很熟悉。
所以我想知道是否有人可以简单地向我解释我的查询出了什么问题以及为什么?
PopulateGridView:
void PopulateGridView()
{
string find = "select * from TBL_USERS where (Name like '%' + @Name + '%') or (employee like '%' + @Employee + '%') and (case when excluded =1 then 'True' else 'False' end like '%false%')";
SqlCommand comm = new SqlCommand(find, con);
comm.Parameters.Add("@Name", SqlDbType.VarChar, 255).Value = TextBox1.Text;
comm.Parameters.Add("@Employee", SqlDbType.VarChar, 32).Value = TextBox1.Text;
comm.Parameters.Add("@Excluded", SqlDbType.Bit, 1).Value = 1;
con.Open();
comm.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = comm;
DataSet ds = new DataSet();
da.Fill(ds, "Name");
da.Fill(ds, "Employee");
da.Fill(ds, "Excluded");
gvTestUsers.DataSource = ds;
gvTestUsers.DataBind();
con.Close();
}
【问题讨论】:
-
“不工作”是什么意思?另外,为什么
WHERE中的CASE表达式而不仅仅是AND excluded = 0? -
您实际看到的是什么,这与您的预期有何不同?注意:最后一个子句(带有
case when excluded)看起来非常可疑——尤其是如果数据库区分大小写——为什么不只是对excluded=@Excluded进行测试呢?此外,如果@Employee是员工编号 - 您可能想要使用=,而不是like -
不要在不使用
( )的情况下混合 AND 和 OR 来准确指定您想要的与和/或 orred。小心将%烘焙到查询中;最好将它放在 parameter 中,这样您就可以选择如何匹配这些值。你如何拥有它总是会做一个“包含”,但如果你把它放在参数中,你可以通过在文本框中发送"John%"的值来做一个“开始”。现在,如果他们将姓名框留空并在员工框中写入,他们无论如何都会得到所有记录,因为name like '%%'为真(姓名为空除外) -
@CaiusJard re "整个代码应该有大约 6 行" -
gvTestUsers.DataSource = con.Query<User>(@"select * from TBL_USERS where ...", new { Name = TextBox1.Text, Employee = TextBox1.Text, Excluded = true }).AsList();- 一行 :) -
最后的那个东西'(排除的情况=1然后'真'否则'假'结束像'%false%')'你可以只使用排除 1吗?此外,您的排除仅适用于员工搜索,而不适用于姓名搜索。这是因为 AND 在其评估顺序中优先于 OR。
标签: c# asp.net sql-server