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

Nil*_*ili 9 c# sql sql-server-2005 email-validation prepared-statement

我在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;
Run Code Online (Sandbox Code Playgroud)

(当然电子邮件包含有效的电子邮件地址,带@符号).

此代码返回一个随机错误 -

"连接已被禁用"{"错误[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+"'";
Run Code Online (Sandbox Code Playgroud)

一切都很完美.

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

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

你能帮忙吗?:)谢谢,Nili

Lev*_*Lev 8

实际上,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;
Run Code Online (Sandbox Code Playgroud)

更棘手的情况是当你没有像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;
Run Code Online (Sandbox Code Playgroud)

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

我希望这有帮助 :-)