我正在从网络表单运行查询以更新记录。因为我刚学习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,应该没问题。
如果是这种情况,我应该将参数转换为什么?如果不是,究竟是什么问题?
答案 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
??相当不寻常和令人困惑...... )
我建议始终为您定义的任何字符串参数定义显式长度