【问题标题】:LIKE clause not returning the values as expectedLIKE 子句未按预期返回值
【发布时间】:2016-12-06 17:20:00
【问题描述】:

我接下来要做的是根据输入的任何值过滤下拉框。例如。如果一个词是"16 cat123",通常用户必须首先输入数字"16" 或数字"1" 才能显示结果。如果用户应该从输入"cat123" 开始,那么我希望它仍然会显示原始项目"16 cat123",而不是这个。我怎样才能做到这一点?我知道它是LIKE 子句与我的SELECT 的组合,但目前它仍然以相同的方式运行,即仅通过输入的第一个字母发回值。这是我当前的查询:

  string query = "SELECT * FROM dbo.Carimed WHERE Item_Description LIKE '%" + comboBox3.Text.Replace("'", "''") + "%'; ";

我错过了什么?

更新完整功能:

private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {

            string connectionString = "Data Source=CMDLAP126;Initial Catalog=Carimed_Inventory;User ID = sa; Password = 123456;";
            string query = " "SELECT * FROM dbo.Carimed WHERE Item_Description LIKE '%" + comboBox3.Text.Replace("'", "''") + "%' ";
            SqlConnection con = new SqlConnection(connectionString);
            con.Open();
            SqlCommand cmd = new SqlCommand(query, con);
            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                string cari_code = dr.GetString(dr.GetOrdinal("item#"));
                textBox2.Text = cari_code;

            }
        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.ToString());
        }

    }

【问题讨论】:

  • 您的逻辑在这里似乎是正确的,LIKE '%value%' 是进行“包含”搜索的正确语法,您可能需要组合一个更完整的示例来说明问题。
  • 参数化你的查询,否则一个聪明的输入(SQL注入)可能会破坏你的数据库。
  • 我通过使用来自here 的该用户的指南找到了解决方法作者所做的是覆盖winforms 中的默认组合框设置。我刚刚找到了一种将它绑定到我的代码中并让它运行起来的方法。希望这对将来的某人有所帮助。

标签: c# sql winforms


【解决方案1】:

试试这个:

string query = "SELECT * FROM dbo.Carimed WHERE Item_Description LIKE '" + comboBox3.Text.Replace("'", "''") + "%'; ";

【讨论】:

    【解决方案2】:
    string query = "SELECT * FROM dbo.Carimed WHERE Item_Description LIKE '%" + comboBox3.Text.Replace("'", "''") + "%' ";
    

    也许删除查询字符串中的分号?

    【讨论】:

    • 这是我在调试时尝试的。同样的问题。还是谢谢你的建议
    • 一切看起来都正确。检查来自 comboBox2.Text 的值是您所期望的,没有多余的字符。
    【解决方案3】:

    除了查询中的额外;,它看起来是正确的。如果适用于您的应用程序,您可能希望修剪内容 (comboBox3.Text.Trim()),以便 "cat123 " 匹配 "16 cat123"。正如 cmets 中所建议的,您应该参数化您的查询。

    【讨论】:

    • 已经从数据库端进行了修剪,所以那里没有问题,是的,我知道它应该被参数化,只是为了暂时练习
    • 你的意思是数据库中的数据被修剪了?或者用户输入被修剪?例如,如果我输入“cat123”,您的查询最终会执行 SELECT ... FROM .. WHERE Item_Description LIKE '%cat123%' 吗?
    • 是的,但万一我没有尝试你的建议,仍然没有运气
    • 你能显示更多的代码吗?也许是构建、执行查询和获取结果集的整个部分?
    • 嗯,有一些地方可以改进。但也许你的问题是textBox2.Text = cari_code;。文本框的内容在循环的每次迭代中都会被替换,这意味着它只会显示结果集中的最后一项。
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2017-06-05
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多