SQL Like子句在不同的项上返回相同的值

时间:2017-10-09 17:53:44

标签: c# sql-server winforms

我在下面的代码块中使用了comboBox上的like子句,并将相关的项目编号从数据库传递到文本框。它有效,但有一个问题。我输入一个值,如下所示,它会按预期显示两个:

enter image description here

我的问题是,当选择显示的任一选项时,它会在传递给它的textBox中带来相同的项目编号。如下面的两个屏幕截图所示:

enter image description here

具有相同项目编号的不同项目的第二个屏幕:

enter image description here

他们在数据库中没有相同的项目编号。我哪里错了?代码如下:

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

            string connectionString = "Data Source=bid;Initial Catalog=BI_ST;Integrated Security=True";
            string query = "SELECT * FROM dbo.IV00 WHERE ITEMDESC LIKE '%" + suggestComboBox2.Text.Trim().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("ITEMNMBR"));
                textBox2.Text = cari_code;
                string intFromSmallInt = Convert.ToString(dr.GetInt16(dr.GetOrdinal("ITEMTYPE")));
                textBox12.Text = intFromSmallInt;

                //con.Close();

            }
        }
        catch (Exception ex)
        {

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


        //      ? Color.Black : Color.Red;
        //    }
    }
}

从SQL Server中查看相同的查询,证明项目编号是唯一的: enter image description here

3 个答案:

答案 0 :(得分:0)

当您选择的索引发生更改时,您将从数据库中选择相同的集并循环遍历所有结果:

while (dr.Read())
{
    string cari_code = dr.GetString(dr.GetOrdinal("ITEMNMBR"));
    textBox2.Text = cari_code;
    string intFromSmallInt = 
    Convert.ToString(dr.GetInt16(dr.GetOrdinal("ITEMTYPE")));
    textBox12.Text = intFromSmallInt;

    //con.Close();

}

这会导致最后Read()被使用。从你的照片中,它的第2号:0160-12011

您需要做的是修改您的程序,以便查询使用描述(itemnmbr)后面的ID来仅获取您需要的结果。

答案 1 :(得分:0)

好的,所以人们已经突出了很多代码问题。除此之外,您的代码按预期执行的原因是因为每次索引在组合框上发生更改时,您都会将数据库中的最后一个结果写入文本框。

也许检查描述是否与组合框选择相匹配,这可以解决您的问题

 while (dr.Read())
 {
 string cari_code = dr.GetString(dr.GetOrdinal("ITEMNMBR"));
 string intFromSmallInt = Convert.ToString(dr.GetInt16(dr.GetOrdinal("ITEMTYPE")));
 var desc = Convert.ToString(dr.GetOrdinal("itemdesc"));
 if(suggestComboBox2.Text.Equals(desc)){
 textBox12.Text = intFromSmallInt;
   textBox2.Text = cari_code;
 }
 //con.Close();
}

答案 2 :(得分:0)

你想要做的就是这个。我正在假设ITEMNMBR的数据类型,我不会检查任何内容,但是这段代码将正确处理您的资源,防止SQL注入,并只选择组合中所选项目的数据:

private void suggestComboBox2_SelectedIndexChanged_1(object sender, EventArgs e)
{
    try
    {
        string connectionString = "Data Source=bid;Initial Catalog=BI_ST;Integrated Security=True";
        string query = "SELECT * FROM dbo.IV00 WHERE ITEMNMBR = @itemnmbr;";
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = query;                
                var parItemNmbr = cmd.Parameters.Add("@itemnmbr", SqlDbType.Int);
                parItemNmbr.Value = suggestComboBox2.SelectedValue;
                con.Open();

                SqlDataReader dr = cmd.ExecuteReader();
                dr.Read();

                string cari_code = dr.GetString(dr.GetOrdinal("ITEMNMBR"));
                textBox2.Text = cari_code;

                string intFromSmallInt = Convert.ToString(dr.GetInt16(dr.GetOrdinal("ITEMTYPE")));
                textBox12.Text = intFromSmallInt;
            }       
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}