我在下面的代码块中使用了comboBox上的like子句,并将相关的项目编号从数据库传递到文本框。它有效,但有一个问题。我输入一个值,如下所示,它会按预期显示两个:
我的问题是,当选择显示的任一选项时,它会在传递给它的textBox中带来相同的项目编号。如下面的两个屏幕截图所示:
具有相同项目编号的不同项目的第二个屏幕:
他们在数据库中没有相同的项目编号。我哪里错了?代码如下:
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;
// }
}
}
答案 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());
}
}