2011-02-10 44 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