C#SQL查询工作在SSMS但不是C#
问题描述:
嘿所有我使用下面的查询在我的C#程序:C#SQL查询工作在SSMS但不是C#
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlDevConnection"].ConnectionString);
SqlCommand command = new SqlCommand(Q, con);
con.Open();
command.Parameters.AddWithValue("@val0", buildTblVal.ToString());
command.Parameters.AddWithValue("@val1", recordID);
command.ExecuteNonQuery();
command.Dispose();
con.Close();
好像我得到的附加信息的错误:不正确的语法关键字“WHERE附近”。当它到达command.ExecuteNonQuery();。
查询看起来是这样的:
UPDATE
[tTrip]
SET
@val0
WHERE
RequestID = @val1
而当其填充它看起来像这样:
UPDATE
tT
SET
RequestType=75,
TripLead='Barker, Bob',
Category=2,
RequestDate='2016-12-15',
ApproxDate='2016-12-15',
AtC='yes',
TStatus='New',
LastModifiedBy='bob\barker',
LastModifiedDate='2017-04-18 10:24 AM'
WHERE
RequestID = 779
我得到的错误:
其他信息:不正确的语法靠近关键字'WHERE'。
但是,当我复制相同的查询并将其粘贴到SSMS它运行得很好。
我会错过什么?
答
参数是值占位符,它们不能是sql子句,语句等。这就是为什么它失败,因为您无法将SET子句的整个字符串作为参数传递。
例如,这是如何使用参数。
UPDATE
tT
SET
RequestType = @requestType,
TripLead = @tripLead,
Category = @category
-- etc
WHERE
RequestID = @requestID
在一个侧面说明,它被认为是最好的做法来包装你的情况下,在该类型实现IDisposable
using
块。这确保即使在发生异常时也始终释放资源。在处理数据库时,这是必须的,因为它可以确保连接在垃圾处理运行之前不会打开(这是非确定性的)。
using(SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlDevConnection"].ConnectionString))
using(SqlCommand command = new SqlCommand(Q, con))
{
con.Open();
// add parameters correctly based on above example
command.Parameters.AddWithValue("@val1", recordID);
command.ExecuteNonQuery();
}
+1
好吧lgor不好改变它。谢谢! – StealthRT
您需要向我们展示了'Q' –
上次更改缺少开引号' – Mangist
您还需要向我们展示buildTblVal –