C# Prepared Statements - @ 符号(at / strudel 符号)查询

Posted

技术标签:

【中文标题】C# Prepared Statements - @ 符号(at / strudel 符号)查询【英文标题】:C# Prepared Statements - @ sign (at / strudel sign) queries 【发布时间】:2011-06-24 16:51:21 【问题描述】:

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

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

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

一切都很完美。

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

我不知道怎么了!其他准备好的语句正常工作...

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

【问题讨论】:

嗯。当我做准备好的语句时,我使用命名参数。达到SELECT * FROM table WHERE id = @id 的程度,然后调用.Parameters.Add("@id", email); -- 试试看是否有效 【参考方案1】:

确实,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 符号)。虽然请注意,在这种情况下,参数值的替换与它们的名称无关,而仅与它们在参数集合中的顺序有关。

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

【讨论】:

@donstack 执行完哪一行之后,你得到了内存分配错误?这是什么类型的错误 - 异常? 谢谢。从 Java 到 C# 并试图理解准备好的语句非常困难。这完美地解释了底部示例中与 Java 类似的方法。呼……【参考方案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;

【讨论】:

问号语法适用于所有其他地方。此外,我尝试使用您建议的语法并得到一个新错误 - “错误 [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]必须声明标量变量“@USER_ID”。”【参考方案3】:

您使用OdbcCommand 而不是使用SqlClient 提供程序是否有特定原因?

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

但是according to MSDN:

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

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

【讨论】:

问号语法适用于所有其他地方。此外,我尝试使用您建议的语法并得到一个新错误 - “错误 [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]必须声明标量变量“@USER_ID”。”

以上是关于C# Prepared Statements - @ 符号(at / strudel 符号)查询的主要内容,如果未能解决你的问题,请参考以下文章

ExecuteBatch 和 Prepared Statements 的奇怪行为

Can't create more than max_prepared_stmt_count statements

MySQL 报 Can't create more than max_prepared_stmt_count statements

NodeJs Mysql Cant't create more than max_prepared_stmt_count statements

Prepared SQL Statement Syntax

[原创] Postgres 系统视图