我收到了以下错误,虽然我已经制作了其他形式,但没有得到任何错误?

时间:2017-11-30 20:59:14

标签: c# sql-server

  

将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);

1 个答案:

答案 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的整数。