我在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+"'";
一切都很完美。
也许这与我在参数化值中有@符号的事实有关?我倾向于认为我不是第一个尝试用电子邮件地址创建预备声明的人......
我不知道出了什么问题!其他准备好的陈述通常正常......
你能帮帮忙吗? :) 谢谢, 尼里答案 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
提供程序,您应该使用其他人建议的命名参数。
用于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;