刷新TextChanged事件上的TextBoxes

时间:2013-01-26 19:35:07

标签: c# ado.net

private void txtItems_TextChanged(object sender, EventArgs e)
{
   try
   {
      MySqlCommand com = new MySqlCommand();
      MySqlDataReader read;
      com.CommandText = "SELECT * FROM Inventory where ProductID ='" + txtbCode.Text + "'";
      com.Connection = MySQLConnection.con;
      MySQLConnection.con.Open();
      read = com.ExecuteReader();
      while (read.Read())
      {
         txtCatogery.Text = read["Catogery"].ToString();
         txtDiscriptions.Text = read["Description"].ToString();
         txtQTY.Text = read["QTY"].ToString();
         txtPrice.Text = read["Price"].ToString();
      }
    //Rest of code
   }
}

当我在txtbCode中键入条形码时,TextBox会从db获取值,但如果我有条形码1234的产品,请继续输入56(123456)我没有带有该条形码的产品条形码,但文本框的值不会刷新,它们保持读取的值约为1234。

我如何实现这一目标?

4 个答案:

答案 0 :(得分:3)

此代码存在多个问题,但为了回答您的主要问题,这是因为您的while (read.Read())行。如果他们查询返回0行,while statement将永远不会执行。

如果您期望单行,则应将其改为if (read.Read()),并添加else条件以清除文本框。

您可能需要考虑的其他问题是确保在完成阅读器后处理阅读器,并使用参数而不是直接将用户输入嵌入到查询中。

答案 1 :(得分:0)

首先,您应该参数化您的查询 - 请参阅 Sql Injection

关于你的问题,你应该在查询数据库之前清除以前的值,因为在你当前的代码中,仅当Read()成功时才更新文本框(例如,你在数据库中有一行)......但是如果如果没有行,它将不会更新,之前的条目将保留。

 private void txtbCode_TextChanged(object sender, EventArgs e)
 {
     txtCatogery.Text = String.Empty;
     txtDiscriptions.Text = String.Empty;
     ...

     try
     {
        MySqlCommand com = new MySqlCommand();
        MySqlDataReader read;
        .....

答案 2 :(得分:0)

您应该检查查询中的返回值,如果没有返回值,请清除Textboxes

        MySQLConnection.con.Open();
        read = com.ExecuteReader();
    if(read != null)
    {
        while (read.Read())
        {
        txtCatogery.Text = read["Catogery"].ToString();
        txtDiscriptions.Text = read["Description"].ToString();
        txtQTY.Text = read["QTY"].ToString();
        txtPrice.Text = read["Price"].ToString();
        }
    }
    else
    {
        txtCatogery.Text = "";
        txtDiscriptions.Text =  "";
        txtQTY.Text =  "";
        txtPrice.Text =  "";
    }

请记住,您的代码可能会产生一些错误,例如,如果从数据库返回多个记录,您的TextBoxes将只显示最后的记录数据。如果任何记录包含空字段,则会因您的.ToString()而生成错误。最后SQL injection是一个主要的威胁,除非您正在编写此代码用于学习。

答案 3 :(得分:0)

您可以使用.HasRows,然后才能.Read()

...
MySqlDataReader read = cmd.ExecuteReader(); 
if (read.HasRows) 
{ 
  while (read.Read())
  {
      //Do Stuff
  }
}
else
{
   //Do Stuff
   txtPrice.Clear();
}