2013-06-04 40 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)); 
} 

與此相關的性能損失很小,但它可能很小,在大多數情況下可以忽略不計。

相關問題