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

时间:2011-02-10 08:32:46

标签: c# sql sql-server-2005 prepared-statement email-validation

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

但是,如果我在没有预备语句的情况下运行我的代码,则意味着:

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

一切都很完美。

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

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

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

3 个答案:

答案 0 :(得分: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;

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

我希望这会有所帮助: - )

答案 1 :(得分:3)

您使用OdbcCommand而不是使用SqlClient提供商的具体原因是什么?

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

但是according to MSDN

  

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

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

答案 2 :(得分: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;