【发布时间】:2018-04-08 05:39:55
【问题描述】:
我有一个 C# 表单,它有 6 个过滤器(5 个组合框和 1 个文本框),用户可以使用它们来执行搜索。问题是用户可以将一些留空或全部使用。为了进行过滤搜索,我在执行 SELECT 查询时使用了 AND,但问题是当某些过滤器为空白时,它将返回空白或空搜索。如果我将每个条件都设为查询,我将有大约 700 个查询。所以我在这个链接中搜索了壁橱,我想,场景
Ignore empty textboxes while searching in database
using (SqlConnection conn = new SqlConnection(@"Data Source=(local);
Initial Catalog=inventory;
Integrated Security=True"))
{
conn.Open();
string query = "SELECT * FROM [dbo].[product] WHERE IsDeleted = '0'";
using (SqlCommand scmd = new SqlCommand())
{
if (!string.IsNullOrEmpty(cmbItem.Text))
{
query += " AND Item Like @Item";
scmd.Parameters.Add("@Item", SqlDbType.VarChar).Value = "%" + item + "%";
}
}
if (!string.IsNullOrEmpty(cmbBrand.Text))
{
query += " AND Brand Like @Brand";
scmd.Parameters.Add("@Brand", SqlDbType.VarChar).Value = "%" + brand + "%";
}
//...additional query
}
scmd.CommandText = query;
scmd.Connection = conn;
using (SqlDataAdapter sda = new SqlDataAdapter(scmd))
{
dataGridView1.Refresh();
DataTable dt = new DataTable();
sda.Fill(dt);
dataGridView1.DataSource = dt;
}
conn.Close();
}
并且在执行搜索时,出现这样的错误;
'无效的列名'IsNull'。'
我原来的查询是这样的。但是,如果 where 条件之一为空白/空,则不会选择任何内容。
SELECT * FROM [dbo].[product] WHERE Item = '" + item + "'
AND Brand = '" + brand + "'
AND Description = '" +desc + "'
AND Manufacturer = '" + manu + "'
AND Car = '" + car + "'
AND Year = '" + year + "'
如果我使用 OR 而不是 AND。它会选择这样的东西。
以下是理想搜索的图片。
已解决,将 IsDeleted='0' 改为 1=1
string query = @"SELECT * FROM[dbo].[product] WHERE 1=1";
【问题讨论】:
-
item和brand是什么,为什么不在您的查询中发送cmbItem.Text和cmbBrand.Text -
在执行命令前检查
query的值,找出IsNull存在的原因。最有可能的“//...附加查询”部分是错误的 -
@ASh //...附加查询部分类似于 if (!string.IsNullOrEmpty(.. 语句。但对于 dsecription、制造商、汽车、年份的其他过滤器。我刚刚发布了前两个缩短它。
-
@styx item 和 brand 是获取 cmbItem 和 cmbBrand 文本值的字符串
-
@Jepher 当您尝试进行原始选择(在您的应用程序中)时,您会根据需要获得值吗?
标签: c# sql-server database