C#字符串中存在SQL语法错误

本文关键字:语法 错误 SQL 存在 字符串 | 更新日期: 2023-09-27 18:20:27

我正在从web表单运行一个查询来更新记录。由于我只是在学习C#,所以我使用的是命令字符串,而不是存储过程。

我的更新方法如下:

public void updateOne()
    {
        string commandText = "update INVOICE SET <Redacted> = @<Redacted>, 
                    Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, 
                              VATTotal = @VAT, InvoiceDate = @InvDt "
       <needed a line break here, which is why I split the string again> 
                              + "WHERE K_INVOICE = @K_INV";
        using (SqlConnection dbConnection = new SqlConnection
                                                    (conParams.connectionString))
        {
            SqlCommand cmd = new SqlCommand(commandText, dbConnection);
            cmd.Parameters.Add("@K_INV", SqlDbType.Int);
            cmd.Parameters["@K_INV"].Value = @K_INV;
            cmd.Parameters.AddWithValue("@<Redacted>", @<Redacted>.ToString());
            cmd.Parameters.AddWithValue("@Sup", @Sup.ToString());
            cmd.Parameters.AddWithValue("@SupN", @SupN.ToString());
            cmd.Parameters.AddWithValue("@Net", @Net.ToString());
            cmd.Parameters.AddWithValue("VAT", @VAT.ToString());
            cmd.Parameters.AddWithValue("@InvDt", @InvDt.ToString());
            try
            {
                dbConnection.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                errorString = e.Message.ToString();
            }
        }
    }

Catch因SQL错误而暂停(SET附近的语法不正确),我认为出现此问题是因为我将参数转换为字符串。第一个参数是Int,应该是OK

如果是这种情况,我应该将参数转换为什么?如果没有,到底出了什么问题?

C#字符串中存在SQL语法错误

尝试在字符串之前添加一个@以转义特征线,例如:

string commandText = @"update INVOICE SET [Redacted] = @Redacted, 
                    Supplier = @Sup, SupplierName = @SupN, NetTotal = @Net, 
                              VATTotal = @VAT, InvoiceDate = @InvDt "
                              + "WHERE K_INVOICE = @K_INV";

在parameterName参数中,您可以为示例添加@,但不能添加值,只能添加变量

cmd.Parameters.AddWithValue("@Redacted", redacted.ToString());

尝试在数据库中使用一些值执行此查询,以检查是否所有内容都正确。如果有保留字,可以在表名和列名中使用[brackets]

我建议您阅读这篇关于.AddWithValue():危险的博客文章

  • 我们可以停止使用AddWithValue了吗

代替

cmd.Parameters.AddWithValue("@Sup", @Sup.ToString());

你应该使用

cmd.Parameters.Add("@Sup", SqlDbType.VarChar, 50).Value = ...(provide value here)..;

你在C#中的变量真的叫@SupN吗??相当不寻常和令人困惑…

我建议您始终为定义的任何字符串参数定义显式长度