C#字符串中的SQL语法错误

时间:2014-09-03 14:43:54

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

我正在从网络表单运行查询以更新记录。因为我刚学习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,应该没问题。

如果是这种情况,我应该将参数转换为什么?如果不是,究竟是什么问题?

2 个答案:

答案 0 :(得分:3)

尝试在字符串前添加@escape the breaklines,样本:

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]

答案 1 :(得分:1)

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

而不是

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

你应该使用

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

是你在C#中的变量真的称为@SupN ??相当不寻常和令人困惑......

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