【问题标题】:How to disregard empty textbox or combobox in SQL SELECT?如何忽略 SQL SELECT 中的空文本框或组合框?
【发布时间】: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。它会选择这样的东西。

OR Statement

OR Statement

以下是理想搜索的图片。

Image for ideal selection

Image for ideal selection

已解决,将 IsDeleted='0' 改为 1=1

string query = @"SELECT * FROM[dbo].[product] WHERE 1=1";

【问题讨论】:

  • itembrand 是什么,为什么不在您的查询中发送 cmbItem.TextcmbBrand.Text
  • 在执行命令前检查query的值,找出IsNull存在的原因。最有可能的“//...附加查询”部分是错误的
  • @ASh //...附加查询部分类似于 if (!string.IsNullOrEmpty(.. 语句。但对于 dsecription、制造商、汽车、年份的其他过滤器。我刚刚发布了前两个缩短它。
  • @styx item 和 brand 是获取 cmbItem 和 cmbBrand 文本值的字符串
  • @Jepher 当您尝试进行原始选择(在您的应用程序中)时,您会根据需要获得值吗?

标签: c# sql-server database


【解决方案1】:

您可以使用存储过程并将参数设置为默认值

样本:

 create proc sptest
     @Fname nvarchar(50),
     @Lname nvarchar(50),
     @NCode nvarchar(12),
     @UserType int
     as

     SELECT DISTINCT PersonID,
                   FName,
                   LName,
                   NationalID,
                   UserType
            FROM   Persons 

            WHERE  
                    (FName LIKE('%' + @Fname + '%') OR (@Fname = ''))
                   AND (LName LIKE('%' + @Lname + '%') OR (@Lname = ''))
                   AND ((NCode = @NCode) OR (@NCode = ''))
                   AND ((UserType = @UserType) OR (@UserType = 0))

当文本框为空或下拉列表未被选中时,获取所有记录

【讨论】:

    【解决方案2】:

    您原来的 if/and 条件应该可以工作,但您可能会遇到表 COLUMN 与 PARAMETER 的错误解析。既然你有

    的例子
    Item like @Item
    

    如果没有实参Item,则SQL暗示使用自己的值。对于这些类型的查询,我尝试为要匹配的参数名称添加前缀。改为

    Item like @parmItem
    

    并且显然更改您的参数名称字符串以匹配“@parmItem”引用。这样一来,SQL 引擎正在寻找的值就没有歧义了。

    【讨论】:

    • 问题是它抛出一个错误'Invalid column name 'IsDeleted'。'
    • @Jepher,“IsDeleted”列是字符还是数字。如果是数字标志,则更改 '0' 以删除引号 IsDeleted = 0
    • 还是同样的问题。我已经通过替换 1=1 解决了它。
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多