ORA-00932:不一致的数据类型:预期DATE得到NUMBER

时间:2013-06-04 15:26:49

标签: c# .net oracle odac

我正在使用.net中的Oracle Data Access,我的查询是

command.CommandText = "select * from table1 where expirydate =:EXPIRYDATE";
command.Parameters.Add("EXPIRYDATE", OracleDbType.Date, DateTime.Today,ParameterDirection.Input);

var results = command.ExecuteScalar();

我收到以下错误“ORA-00932:不一致的数据类型:预期DATE得到NUMBER”

如果我将查询更改为:

command.CommandText ="select * from table1 where expirydate =
to_date(:EXPIRYDATE,'DD/MM/YYYY')";

我没有结果。

提前致谢。

2 个答案:

答案 0 :(得分:12)

此错误的最可能原因是查询中参数的顺序与您将其添加到Parameters集合的顺序不匹配。 Oracle Data Access假装按名称绑定它们,但实际上是按顺序绑定它们。

答案 1 :(得分:4)

如果你正在使用ODP.NET,OracleCommand应该有一个BindByName属性,它会强制命令按名称而不是命令绑定参数。

const string sql = @"select :parameter2, :parameter1 from dual";

using (var cmd = new OracleCommand(sql, conn))
using (cmd.Parameters.Add(":parameter1", "FOO"))
using (cmd.Parameters.Add(":parameter2", "BAR"))
using (var reader = cmd.ExecuteReader()) {
    reader.Read();
    // should print "FOOBAR"
    Console.WriteLine("{0}{1}", reader.GetValue(0), reader.GetValue(1));
}

using (var cmd = new OracleCommand(sql, conn) { BindByName = true })
using (cmd.Parameters.Add(":parameter1", "FOO"))
using (cmd.Parameters.Add(":parameter2", "BAR"))
using (var reader = cmd.ExecuteReader()) {
    reader.Read();
    // should print "BARFOO"
    Console.WriteLine("{0}{1}", reader.GetValue(0), reader.GetValue(1));
}

与此相关的性能略有下降,但在大多数情况下,它可能小到可以忽略不计。