ORA-00932:数据类型不一致:expected DATE got NUMBER

本文关键字:got NUMBER DATE 不一致 数据类型 ORA-00932 expected | 更新日期: 2023-09-27 18:16:57

我正在使用Oracle数据访问从。net和我的查询是

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

我得到以下错误" ORA-00932: inconsistent datatypes: expected DATE got NUMBER"

如果我将查询改为:

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

我没有得到结果

ORA-00932:数据类型不一致:expected DATE got NUMBER

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

如果您正在使用ODP。. NET, oracleccommand应该有一个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));
}

与此相关的性能损失很小,但在大多数上下文中可能小到可以忽略不计。

即使您按名称添加参数,如果您没有明确告诉oracleccommand您正在使用按名称绑定,它也会使用按顺序/索引绑定。我得到了相同的错误"ORA-00932:不一致的数据类型:预期日期得到数字",当我设置BindByName为true,它工作。

OracleCommand command = new OracleCommand()
{
    Connection = conn,
    BindByName = true
};