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。
我如何实现这一目标?
答案 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)