我正在使用.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')";
我没有结果。
提前致谢。
答案 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));
}
与此相关的性能略有下降,但在大多数情况下,它可能小到可以忽略不计。