Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的更新语法错误#_C#_Sql_Sql Server_Ado.net - Fatal编程技术网

C# C语言中的更新语法错误#

C# C语言中的更新语法错误#,c#,sql,sql-server,ado.net,C#,Sql,Sql Server,Ado.net,我想用datagridview数据更新数据库这是我的代码: 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 Item

我想用datagridview数据更新数据库这是我的代码:

        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;
        }
for(int i=0;i

它在何处附近给出语法错误。

您应该使用参数,在SQL查询中附加字符串是一个非常糟糕的主意(SQL注入)。下面应该会让错误更清楚:

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();
}
for(int i=0;i
我假设语法错误来自SQL连接。如果是这样的话,参数化应该解决它。您可以使用以下工具使正确参数化变得简单:

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;
}
for(int i=0;i
有两件事不对:

  • tdataGridView1.Rows[x]。Cells[4]。值可能会生成一个包含逗号的值,该值可被数据库识别,因此10,4的值不会被视为10.4,而是被视为一个新字段

    从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添加到数量中,而不是得到异常

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

    您的输入有效吗?显示一个已对此进行测试的示例输入。在查询中使用参数在执行任何其他操作之前,请阅读有关CommandParameters的内容,请参阅:@joeTaras我的输入是文本,ItemName是nvarchar(25)语法是quantity=quantity+datagridview单元格,我想增加到数量字段我已经在我的答案中编辑了如何使用参数添加到数量。