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它运行得很好。

我会错过什么?

+2

您需要向我们展示了'Q' –

+4

上次更改缺少开引号' – Mangist

+0

您还需要向我们展示buildTblVal –

参数是值占位符,它们不能是sql子句,语句等。这就是为什么它失败,因为您无法将SET子句的整个字符串作为参数传递。

例如,这是如何使用参数。

UPDATE 
    tT 
SET 
    RequestType = @requestType, 
    TripLead = @tripLead, 
    Category = @category 
    -- etc 
WHERE 
    RequestID = @requestID 

在一个侧面说明,它被认为是最好的做法来包装你的情况下,在该类型实现IDisposableusing块。这确保即使在发生异常时也始终释放资源。在处理数据库时,这是必须的,因为它可以确保连接在垃圾处理运行之前不会打开(这是非确定性的)。

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