2011-02-10 86 views
9

我有在C#中準備好的聲明一個問題:C#編寫的報告 - @符號(AT /點心符號)查詢

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 

(當然,郵件中包含一個有效的電子郵件地址,用@符號)。

此代碼返回一個隨機錯誤 -

「的連接已經被禁用」 {「ERROR [01000] [微軟] [ODBC SQL Server驅動程序] [TCP/IP 套接字] ConnectionWrite(發送())。 錯誤[08S01] [微軟] [ODBC SQL Server驅動程序] [TCP/IP套接字]一般 網絡錯誤。請檢查您的網絡 文檔。「}

Howeve r如果我沒有準備好的聲明運行我的代碼,意思是:

cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = '"+email+"'"; 

一切正常。

也許這與我在參數化值中有@符號這一事實有關?我傾向於認爲我不是第一個試圖用電子郵件地址創建預備聲明的人...

我不知道什麼是錯的!其他準備好的陳述正常工作...

你能幫忙嗎? :) 謝謝, Nili

+1

嗯。當我準備好陳述時,我使用命名參數。在SELECT * FROM table WHERE id = @ id`的範圍內,然後調用`.Parameters.Add(「@ id」,email);` - 試試看看它是否有效 – Zack 2011-02-10 08:38:17

回答

7

的確,ODBC在支持命名參數方面存在着一些問題。 但是,命名參數的某些用法是可能的。

例如,你的情況的語法如下工作:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = ?"; 
cmd.Parameters.Add("USER_ID", OdbcType.VarChar, 250).Value = email; 

更棘手的情況是,當你沒有像USER_ID參數唯一匹配=;例如,當您想要在WHERE子句中使用IN運算符。

那麼下面的語法將做的工作:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID IN (?, ?)"; 
cmd.Parameters.Add("?ID1", OdbcType.VarChar, 250).Value = email1; 
cmd.Parameters.Add("?ID2", OdbcType.VarChar, 250).Value = email2; 

請注意,使用?(問號)而不是@(在符號)內的參數名稱。雖然請注意,在這種情況下,參數值的替換與它們的名稱無關,但僅與參數集合的順序有關。

我希望這有助於:-)

+0

獲取內存分配錯誤 – donstack 2013-11-26 07:50:38

2

使用'@USER_ID'而不是'?'和所有應工作:

OdbcCommand cmd = sql.CreateCommand(); 
cmd.CommandText = "SELECT UNIQUE_ID FROM userdetails WHERE USER_ID = @USER_ID"; 
cmd.Parameters.Add("@USER_ID", OdbcType.VarChar, 250).Value = email; 
+0

問號語法適用於所有其他地方。此外,我嘗試使用您建議的語法,並得到一個新的錯誤 - 「錯誤[42000] [微軟] [ODBC SQL Server驅動程序] [SQL Server]必須聲明標量變量」@USER_ID「。」 – Nili 2011-02-10 09:03:12

3

有你使用OdbcCommand,而不是使用SqlClient提供一個具體的原因?

對於SqlClient提供程序,您應該使用別人建議的命名參數。

according to MSDN

的.NET Framework數據提供OLE DB和.NET Framework數據提供ODBC不支持命名參數,將參數傳遞給SQL語句或存儲過程。在這種情況下,您必須使用問號(?)佔位符,如下例所示。

所以我不確定命名參數將在這種情況下工作。

+0

問號語法適用於所有其他地方。此外,我嘗試使用您建議的語法,並得到一個新的錯誤 - 「錯誤[42000] [微軟] [ODBC SQL Server驅動程序] [SQL Server]必須聲明標量變量」@USER_ID「。」 – Nili 2011-02-10 09:04:18