我正在开发一个库存软件,我希望通过与ProductCode进行比较来访问ProductName和产品价格,我已经存储在名为ProductLog的数据库表中的数据,产品日志中的数据是:
ItemNO Productode ProductName ProductPrice
1 123 lux 58
2 321 soap 68
现在我希望我只在名为txtProductCode的教科书中输入productCode,然后按Tab键,然后自动填充ProductPrice(txtProductPrice)和ProductName(txtProductName)框。
我尝试比较Productcode和访问值的代码是:
private void txtProdcutCode_Leave(object sender, EventArgs e)
{
///////////////////////////////////////////////////////////////////////
InitializeComponent();
string sql;
int productCode = 0;
productCode = Convert.ToInt32(txtProdcutCode.Text);
sql = "";
sql = "SELECT dbo.ProductLog.ProductName, dbo.ProductLog.ProductName";
sql = " WHERE ProductLog.ProductCode = " + txtProdcutCode.Text + "";
SqlConnection cn = new SqlConnection();
SqlCommand rs = new SqlCommand();
SqlDataReader sdr = null;
clsConnection clsCon = new clsConnection();
clsCon.fnc_ConnectToDB(ref cn);
rs.Connection = cn;
rs.CommandText = sql;
sdr = rs.ExecuteReader();
while (sdr.Read())
{
txtProductPrice.Text = sdr["ProductPrice"].ToString();
txtProductName.Text = sdr["ProductName"].ToString();
}
//lblTotalQuestion.Text = intQNo.ToString();
sdr.Close();
rs = null;
cn.Close();
/////////////////////////////////////////////////////////////////////////
}
但在productCode = Convert.ToInt32(txtProdcutCode.Text);
行中,它显示Input string was not in a correct format.
请帮我解决这个问题。
我也试过这段代码:
private void txtProdcutCode_Leave(object sender, EventArgs e)
{
///////////////////////////////////////////////////////////////////////
string sql;
// int productCode = 0;
//productCode = Convert.ToInt32(txtProdcutCode.Text);
sql = "";
sql = "SELECT dbo.ProductLog.ProductName, AND dbo.ProductLog.ProductName";
sql = " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";
SqlConnection cn = new SqlConnection();
SqlCommand rs = new SqlCommand();
SqlDataReader sdr = null;
clsConnection clsCon = new clsConnection();
clsCon.fnc_ConnectToDB(ref cn);
rs.Connection = cn;
rs.CommandText = sql;
sdr = rs.ExecuteReader();
while (sdr.Read())
{
txtProductPrice.Text = sdr["ProductPrice"].ToString();
txtProductName.Text = sdr["ProductName"].ToString();
}
//lblTotalQuestion.Text = intQNo.ToString();
sdr.Close();
rs = null;
cn.Close();
/////////////////////////////////////////////////////////////////////////
}
但它说Incorrect syntax near the keyword 'WHERE'.
表示我在查询中调用数据库表时出错,但我无法找出错误......
答案 0 :(得分:2)
您的SQL存在一些问题。
为了解决这个问题(第1-4点,我将为你自己的研究留下第5点),
sql = "";
sql = "SELECT dbo.ProductLog.ProductName, AND dbo.ProductLog.ProductName";
sql = " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";
应该是
sql += "SELECT ProductName, ProductPrice";
sql += " FROM dbo.ProductLog";
sql += " WHERE ProductCode = '" + txtProdcutCode.Text + "'";
注意:这个答案假定txtProductCode.Text的值是一个整数!
编辑:事实证明,ProductCode列是一个VarChar。对于OP 当你得到SQL转换错误时,和其他人阅读这个问题 检查SQL Server中的列数据类型,并确保它与之匹配 你提交了。
这是基础知识。还有许多其他改进可以做,但这会让你前进。了解基本的SQL语法,一旦解决了这个问题,请考虑使此查询使用参数,而不是直接将txtProductCode.Text
放入查询中。祝你好运!
答案 1 :(得分:1)
永远不要再调用InitializeComponent
方法两次。它正在创建表单和控件,并且它在表单的构造函数中调用。可能当你离开textBox时它再次创建而textBox
将是空白的。因此你得到了错误。从代码中删除InitializeComponent
,然后重试。
更新:您的命令文本错误。您应该使用+=
sql += " WHERE dbo.ProductLog.ProductCode = " + txtProdcutCode.Text + "";
但这不是优雅和安全的。而是使用paramatirezed queries这样:
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
cmd.CommandText = "SELECT dbo.ProductLog.ProductName,dbo.ProductLog.ProductName WHERE dbo.ProductLog.ProductCode = @pCode";
cmd.Parameters.AddWithValue("@pCode", txtProdcutCode.Text );