当前位置: 首页 > 面试题库 >

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

董和风
2023-03-14
问题内容

我对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;

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

我希望这有帮助 :-)



 类似资料:
  • 问题内容: 我正在使用准备好的语句来执行mysql数据库查询。我想实现基于各种关键字的搜索功能。 为此,我需要使用关键字,我知道很多。而且我之前也使用过预处理语句,但是我不知道如何使用它,因为从以下代码中,我将在哪里添加? 我可以直接在as 或类似的东西中使用它吗?我在网络上看到很多帖子,但是在任何地方都没有好的答案。 问题答案: 您需要在值本身中而不是在准备好的语句SQL字符串中进行设置。 因此

  • 问题内容: 我正在尝试运行以下查询,但通配符出现问题。 我收到一条错误消息,指出:无法通过引用传递参数2。我需要使用通配符的原因是因为列的数据包含序列化的数组。我想,如果有一种更简单的方法来处理此问题,该怎么办? 提前致谢! 问题答案: 您必须通过引用传递参数,这意味着您必须传递 单个变量 (而不是串联字符串)。不过,没有理由您不能专门构造这样的变量来传递:

  • 问题内容: 这是我的Java JDBC代码(例如,经过修改和简化): 因为字符串中有圆括号,所以它不起作用。 如何在准备好的语句中转义括号? 编辑:根据我的回答(见下文),我确实提出了问题。 问题答案: 会回答自己-问题出在“〜”(波浪号)中。 经过详细阐述,有一个有趣的发现: 如果是SQL代码(请参见SQL代码中的“等号”): 无需转义。但是,如果这是SQL代码(请参见SQL代码中的“波浪号”标

  • 问题内容: 我想创建一个JDBC PreparedStatement,例如: 其中第一个是文字,第二个是参数。我可以代替,但我认为额外的函数调用会减慢SQL的执行速度。有什么办法可以逃脱第一个? 编辑: 以下代码测试dkatzel的断言:字符串中的字符不被视为标记: 输出: 看来dkatzel是正确的。我搜索了JDBC Spec ,但没有发现 参数标记如果在引号内将被忽略,但是我发现的Prepar

  • 问题内容: 我正在使用准备好的语句来执行mysql数据库查询。我想实现基于各种关键字的搜索功能。 为此,我需要使用关键字,这一点我知道很多。而且我之前也使用过预处理语句,但是我不知道如何使用它,因为从以下代码中,我将在哪里添加? 我可以直接在或类似的东西中使用它吗?我在网络上看到很多帖子,但在任何地方都没有好的答案。 问题答案: 你需要在值本身中而不是在准备好的语句SQL字符串中进行设置。 因此,