我对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;
(当然,电子邮件包含有效的电子邮件地址,带有@符号)。
此代码返回一个随机错误-
“”连接已被禁用“ {”错误[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;
请注意的用法 ? (问号)而不是参数名称中的 @ (符号)。尽管注意在这种情况下参数值的替换与它们的名称无关,而仅与它们在参数集合中的顺序无关。
我希望这有帮助 :-)