【问题标题】:How do i make a sql select dynamic string comparison to work?如何使 sql 选择动态字符串比较起作用?
【发布时间】:2019-05-27 13:20:39
【问题描述】:

我试图从一个 wpf 数据网格单击的单元格中获取正确的字符串,我将在 sql 选择语句中使用该单元格到第二个 wpf 数据网格。 输入静态字符串值时,它将起作用,但不能来自动态字符串。我的代码有什么问题?

    private void dataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        DataRowView row = (DataRowView)dataGrid1.SelectedItems[0];
        string barcode_string = row["BarCode"].ToString();

        //string barcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = '" + barcode_string + "'";
        string barcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = 'L002BO4'";
    }

在 sql 语句中输入字符串时,它就像一个魅力,但我当然希望从大型数据库返回的动态字符串也能工作。

【问题讨论】:

  • 我忘了提到那个字符串barcode_string = row["BarCode"].ToString();返回 L002BO4,就像我想要的一样。
  • 您正在从数据库中查找的排序动态字符串是作为注释启动并运行的查询,或者是将输入作为变量发送的动态化,这意味着您指的是不手动输入
  • 您在调试时得到的barcode_string 是否符合您的预期值
  • 我忘了提到那个字符串barcode_string = row["BarCode"].ToString();返回 L002BO4,就像我想要的一样。 stringbarcode_detail = "选择 BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = '" + barcode_string + "'";没用。
  • 你看到打印相同语句的输出了吗?

标签: c# sql wpf datagrid string-comparison


【解决方案1】:

请不要在 SQL 语句中连接字符串。使用参数。检查您的数据库中 BarCode 列的正确数据类型。

    private void DataGrid1_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        DataTable dt = new DataTable();
        DataRowView row = (DataRowView)dataGrid1.SelectedItems[0];
        string barcode_string = row["BarCode"].ToString();

        //string barcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = '" + barcode_string + "'";
        string barcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = @BarCode;";
        using (SqlConnection cn = new SqlConnection("Your connection string")) 
        {
            SqlCommand cmd = new SqlCommand(barcode_detail, cn);
            cmd.Parameters.Add("@BarCode", System.Data.SqlDbType.VarChar).Value = barcode_string;
            cn.Open();
            dt.Load(cmd.ExecuteReader());
            //use the data in the data table
        }
    }

编辑 测试琴弦。添加using System.Diagnostics使用Debug.Print

        String literal = "L002BO4";
        String variable = row["BarCode"].ToString();
        if (literal.Length == variable.Length)
            Debug.Print("The length of the strings match");
        else
            Debug.Print("The lengths do not match");
        Char[] variableArray = variable.ToCharArray();
        Char[] literalArray = literal.ToCharArray();
        for (int index =0; index<literalArray.Length; index++)
        {
            if (variableArray[index] == literalArray[index])
                Debug.Print($"index {index} matches");
            else
                Debug.Print($"index {index} does not match");
        }

【讨论】:

  • 不知道你在说什么。我想做一个字符串比较。把它做好有多难?我之前已经这样做了数千次,但在这种情况下它不起作用。怎么了?
  • @MattiasSturebrand “不知道你在说什么。”好吧,我们两个。
  • 我已将错误隔离为表达式:stringbarcode_string = row["BarCode"].ToString();好像返回的是L002BO4的字符串,但不是你声明stringbarcode_string = "L002BO4"那么有什么问题???
  • 试试.Trm 可能会有不可见的空白。
  • 你能给我举个例子吗?我猜你会让我使用字符串的修剪表达式?
【解决方案2】:

您在最后一次查询中错过了一个"。试试这个

    string barcode_detail = "SELECT BarCode, PCBGUID 
       FROM TB_AOIResult WHERE
          BarCode = "+"\'" +barcode_string + "\'";

【讨论】:

  • 不,我很抱歉,但这不是正确的语法。 stringbarcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = "+"'"barcode_string + "'";
  • 哎呀,我错过了+,请您现在检查一下
  • 不,我很抱歉,但这不起作用。 stringbarcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = "+"'" + barcode_string + "'";
【解决方案3】:

你能像下面这样试试吗

 string barcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = "+ barcode_string;

【讨论】:

  • 你可以尝试这样使用 --> stringbarcode_detail = "SELECT BarCode, PCBGUID FROM TB_AOIResult WHERE BarCode = N'''barcode_string ''' ";
猜你喜欢
  • 2021-02-17
  • 2016-03-02
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
相关资源
最近更新 更多