将参数添加到SQL查询的WHERE子句中

时间:2010-12-26 20:38:36

标签: c# oracle ado.net odbc

我正在使用ADO.NET通过ODBC连接到Oracle DB。除了使用简单的SQL查询绑定参数外,一切正常:

Connection.Open();
IDbCommand command = Connection.CreateCommand();
command.CommandText = "SELECT length FROM activity_type WHERE name = :name_of_activity";
var parameter = command.CreateParameter();
parameter.ParameterName = ":name_of_activity";
parameter.Value = "Short_break";
command.Parameters.Add(parameter);
int result = Convert.ToInt32(command.ExecuteScalar());
Connection.Close();

它总是返回0结果(来自ExecuteScalar()的空值 - 来自读者的相同)。但是,如果我提出一个简单的SQL查询:command.CommandText = "SELECT length FROM activity_type WHERE name = 'Short_break'"它就像一个魅力。更重要的是,我在INSERT INTO子句的代码中使用了类似的结构,并且它们没问题。

我错过了什么吗?

3 个答案:

答案 0 :(得分:7)

来自OdbcCommand.Parameters的文档:

  

当CommandType设置为Text时,ODBC的.NET Framework数据提供程序不支持将命名参数传递给SQL语句或OdbcCommand调用的存储过程。在其中任何一种情况下,请使用问号(?)占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

换句话说,您的代码应如下所示:

Connection.Open();
IDbCommand command = Connection.CreateCommand();
command.CommandText = "SELECT length FROM activity_type WHERE name = ?";
var parameter = command.CreateParameter();
parameter.Value = "Short_break";
command.Parameters.Add(parameter);
int result = Convert.ToInt32(command.ExecuteScalar());
Connection.Close();

(你可能应该考虑使用using语句,请注意......否则如果抛出异常,你将不会关闭连接。)

答案 1 :(得分:0)

根据您的描述,问题只能在参数中。

也许在SQL Server上的varchar和nvarchar之间有某种奇怪的混淆,换句话说,尝试显式设置数据类型。

答案 2 :(得分:0)

尝试更改此行:

parameter.ParameterName = ":name_of_activity";

parameter.ParameterName = "name_of_activity";

换句话说,删除冒号字符