我想用datagridview数据更新datebase这里是我的代码:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
SqlCommand cmd2 = new SqlCommand("UPDATE Pharmacy_Items Set Quantity= Quantity + " + dataGridView1.Rows[x].Cells[4].Value + " where ItemName='" + dataGridView1.Rows[x].Cells[1].Value + "'", mycon);
cmd2.ExecuteNonQuery();
x += 1;
}
它在哪里提供语法错误。
答案 0 :(得分:3)
有两件事是错的:
tdataGridView1.Rows [x] .Cells [4] .Value可能会产生一个带有逗号的值,该值由数据库识别,因此10,4的值不会被视为10.4但是4是被视为一个新的领域
OR
您从dataGridView分配的某些值为空
使用参数而不是像这样建立您的查询,不仅更安全,而且还可以修复数量字段的问题
示例:
cmd2.CommandText = "UPDATE Pharmacy_Items Set Quantity = Quantity + @Quantity where ItemName = @ItemName";
cmd2.Parameters.AddWithValue(@Quantity, dataGridView1.Rows[x].Cells[4].Value);
cmd2.Parameters.AddWithValue(@ItemName, dataGridView1.Rows[x].Cells[1].Value);
cmd2.ExecuteNonQuery();
编辑:OP希望增加数量字段。
cmd2.CommandText = "UPDATE Pharmacy_Items Set Quantity = Quantity + @Quantity where ItemName = @ItemName";
cmd2.Parameters.AddWithValue(@Quantity, dataGridView1.Rows[x].Cells[4].Value);
cmd2.Parameters.AddWithValue(@ItemName, dataGridView1.Rows[x].Cells[1].Value);
cmd2.ExecuteNonQuery();
如果单元格可以为空,则可以将0替换为0,这样您只需将0添加到数量而不是获得异常。
cmd2.CommandText = "UPDATE Pharmacy_Items Set Quantity = Quantity + @Quantity where ItemName = @ItemName";
cmd2.Parameters.AddWithValue(@Quantity, dataGridView1.Rows[x].Cells[4].Value ?? 0);
cmd2.Parameters.AddWithValue(@ItemName, dataGridView1.Rows[x].Cells[1].Value);
cmd2.ExecuteNonQuery();
答案 1 :(得分:0)
你应该使用参数,在SQL查询中附加字符串是一个非常糟糕的主意(SQL-Injection)。下面应该使错误更清楚:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
decimal qty = Convert.ToDecimal(dataGridView1.Rows[x].Cells[4].Value);
string itemName = dataGridView1.Rows[x].Cells[1].Value;
string commandText = "UPDATE Pharmacy_Items Set Quantity= Quantity + @p1 WHERE ItemName = @p2";
SqlCommand cmd2 = new SqlCommand(commandText, mycon);
cmd2.Parameters.AddWithValue("@p1", qty);
cmd2.Parameters.AddWithValue("@p2", itemName);
cmd2.ExecuteNonQuery();
}
答案 2 :(得分:0)
我将假设语法错误来自SQL连接。如果是这样,参数化应该修复它。您可以使用Dapper之类的工具来简化参数化:
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
string itemName = (string)dataGridView1.Rows[x].Cells[1].Value;
// note: I don't know what the actual type is here; int? decimal?
int quantity = (int)dataGridView1.Rows[x].Cells[4].Value;
myCon.Execute(
"UPDATE Pharmacy_Items Set Quantity=Quantity+@quantity where ItemName=@itemName",
new { itemName, quantity });
x += 1;
}