2017-04-18 51 views
1

嘿所有我使用下面的查詢在我的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 –

回答

7

參數是值佔位符,它們不能是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

相關問題