2013-06-04 37 views
3

我使用.NET从Oracle数据访问和我的查询是ORA-00932:不一致的数据类型:DATE有望得到NUMBER

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

是否有某些原因需要使用参数?

command.CommandText = "select * from table1 where expirydate = '" + DateTime.Now.ToString("dd-MMM-yy") + "'"; 
+0

'更改会话集nls_date_format ='dd-mon-yyyy“''或''a''=''a”';' –

+4

您好,答案是红鲱鱼,我查询失败的原因是参数,谢谢你的帮助! – MicroMan

7

此错误最可能的原因是,该参数的查询中的顺序不匹配,你把它们添加到收藏Parameters的顺序。 Oracle Data Access假装按名称绑定它们,但实际上按顺序绑定它们。

+1

OMG !!!!!!我们必须查看我们所有的代码,看看是否有任何错误:( – Michael

3

如果您使用的是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)); 
} 

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

相关问题