将varchar值'Bunifu.Framework.UI.BunifuMetroTextbox'转换为数据类型int时转换失败。
代码:
SqlConnection con = new SqlConnection("Data Source=DESKTOP-1FDJLDP\\SQLEXPRESS;Initial Catalog=final;Integrated Security=True");
con.Open();
SqlCommand com4 = new SqlCommand
(" update HOUSEHOLD
set
name= '" + NameTextbox.Text + "',
weight='" + ColorTextbox.Text + "',
brand='" + BrandNameTextbox.Text + "',
packsize='" + SizeTextbox.Text + "',
HOID='" + ItemNUmberTextbox.Text + "',
price='" + PriceTextbox.Text + "',
stock='" + StockTextbox.Text +"'
where HOID= '" + ItemNUmberTextbox + "';", con);
int o = com4.ExecuteNonQuery();
MessageBox.Show(o + "Records has been updated:");
con.Close();
表:
CREATE TABLE HOUSEHOLD_(
HOID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
WEIGHT VARCHAR(50) NOT NULL,
BRAND VARCHAR(50) NOT NULL,
PACKSIZE VARCHAR(50) NOT NULL,
PRICE INT NOT NULL,
STOCK INT NOT NULL);
答案 0 :(得分:3)
你写了
where HOID= '" + ItemNUmberTextbox + "';", con);
而不是
where HOID= '" + ItemNUmberTextbox.Text + "';", con);
忘记.Text
部分。这会产生异常。
您的方法有其他问题,应该是这样的:
const string ConnectionString = @"Data Source=DESKTOP-1FDJLDP\SQLEXPRESS;Initial Catalog=final;Integrated Security=True";
const string updateSql = @"UPDATE household
SET
name = @name, weight = @weight,
brand = @brand, packsize = @packsize,
price = @price, stock = @stock
WHERE hoid = @hoid";
using (var con = new SqlConnection(ConnectionString)) {
var com4 = new SqlCommand(updateSql);
com4.Parameters.AddWithValue("@name", NameTextbox.Text);
com4.Parameters.AddWithValue("@weight", ColorTextbox.Text); // Why ColorTextbox for weight?
com4.Parameters.AddWithValue("@brand", BrandNameTextbox.Text);
com4.Parameters.AddWithValue("@packsize", SizeTextbox.Text);
com4.Parameters.AddWithValue("@price", Convert.ToInt32(PriceTextbox.Text));
com4.Parameters.AddWithValue("@stock", Convert.ToInt32(StockTextbox.Text));
com4.Parameters.AddWithValue("@hoid", Convert.ToInt32(ItemNUmberTextbox.Text));
con.Open();
int o = com4.ExecuteNonQuery();
MessageBox.Show($"{o} Record{(o == 1 ? " has" : "s have")} been updated.");
}
将您的连接对象包含在using语句中。这可确保关闭和处理连接。
使用命令参数。这会处理包含撇号的文本(')并阻止SQL-injection。如果多次调用查询文本,这也会加快查询速度,因为查询文本现在看起来总是相同,并且SQL-Server可以重用以前的执行计划。并且您必须同意SQL文本现在更具可读性。
请勿再次设置hoid
。由于where子句,它已经具有正确的值。
此外,应将数字(以及所有其他非文本类型的参数)转换为与表模式中的列定义相对应的类型。为简单起见,我没有在此处包含错误检查。在调用此方法之前,您应该检查用户输入是否真的可以转换为价格,股票和hoid
的整数。