C#准备语句 – @符号(at / strudel符号)查询

我在C#中准备好一个语句有问题:

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] [Microsoft] [ODBC SQL Server驱动程序] [TCP / IP套接字] ConnectionWrite(send())。错误[08S01] [Microsoft] [ODBC SQL Server驱动程序] [TCP / IP套接字]常规网络错误。请检查您的网络文档。“}

但是,如果我在没有准备好的语句的情况下运行我的代码,

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

一切都很完美。

也许这与我在参数化值中有@符号的事实有关? 我倾向于认为我不是第一个尝试使用电子邮件地址创建预备声明的人…

我不知道出了什么问题! 其他准备好的陈述通常有效

你能帮忙吗? :)谢谢,尼丽

实际上,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; 

请注意使用方法 (问号)而不是参数名称中的@ (at符号)。 虽然请注意,在这种情况下,参数值的替换与它们的名称无关,但仅与它们与参数集合的顺序无关。

我希望这有帮助 :-)

是否有特定原因使用OdbcCommand而不是使用SqlClient提供程序?

使用SqlClient提供程序,您应该使用其他人建议的命名参数。

但根据MSDN :

用于OLE DB的.NET Framework数据提供程序和用于ODBC的.NET Framework数据提供程序不支持将参数传递给SQL语句或存储过程的命名参数。 在这种情况下,您必须使用问号(?)占位符,如下例所示。

所以我不确定命名参数在这种情况下是否有效。

使用’@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;