C#中的更新语法错误

时间:2016-07-04 10:47:46

标签: c# sql sql-server ado.net

我想用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;
        }

它在哪里提供语法错误。

3 个答案:

答案 0 :(得分:3)

有两件事是错的:

  1. tdataGridView1.Rows [x] .Cells [4] .Value可能会产生一个带有逗号的值,该值由数据库识别,因此10,4的值不会被视为10.4但是4是被视为一个新的领域 OR
    您从dataGridView分配的某些值为空

  2. 使用参数而不是像这样建立您的查询,不仅更安全,而且还可以修复数量字段的问题

  3. 示例:

    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;
}