2009-10-14 43 views
3

我有字符串格式中的ANB乙得到ORA-01843,當我嘗試插入日期和時間到Oracle

A = 14/01/2007

B = 22時10分39秒

我嘗試插入日期和時間:

SQL = "insert into MyTbl(Tdate,Ttime) value ('" + Convert.ToDateTime(A) + "','" + Convert.ToDateTime(B) + "')"; 

我得到ORA-01843錯誤,我可以做什麼?

感謝的提前

+0

變量SQL包含什麼後,顯示賦值? – mjv

+0

另外,哪些數據類型是Tdate和Ttime? –

回答

2

的錯誤是由於月,嘗試:

TO_DATE(A, 'DD/MM/YYYY')

8

不要使用原始的SQL語句來插入值。改爲使用參數化查詢。解析你的字符串到.NET DateTime(或DateTimeOffset)和TimeSpan值以正常的方式,然後使用類似:

string sql = "insert into MyTbl(Tdate,Ttime) values (:date, :time)"; 
using (OracleCommand cmd = new OracleCommand(sql, connection)) 
{ 
    cmd.CommandType = CommandType.Text; 
    cmd.Parameters.Add("date", OracleType.DateTime).Value = date; 
    cmd.Parameters.Add("time", OracleType.IntervalDayToSecond).Value = time; 
    cmd.ExecuteNonQuery(); 
} 

(顯然調整的各類實際的字段。)

+1

+1綁定變量!另外,將日期和時間存儲在兩個單獨的字段中是愚蠢的,正如其他地方提到的那樣。 – Rob

+0

從[MSDN](http://msdn.microsoft.com/zh-cn/library/system.data.oracleclient.oraclecommand.aspx)開始,它看起來像OracleCommand現在已經過時了。 – ssgao

1

記住Oracle沒有時間專用字段。

您正在嘗試在日期時間中插入一個僅用於時間的字段。我的猜測是CLR將B變成00/00/00 22:10:39,這不是有效的預言日期。例如:

SQL> select to_date('00/00/00', 'MM/DD/YY') from dual; 
select to_date('00/00/00', 'MM/DD/YY') from dual 
       * 
ERROR at line 1: 
ORA-01843: not a valid month 

無論哪種方式,Convert.ToDateTime(B)可能不會返回正確的東西。

而且,這樣的:

"insert into MyTbl(Tdate,Ttime) value (" 

應該是這樣的:

"insert into MyTbl(Tdate,Ttime) values (" 

...但我猜這就是這裏只是一個錯字。

1

但是我想喬恩方法,它沒有爲我工作的日期也時刻。所以我發現這種方法的日期時間。也許這會在未來幫助別人。

OracleParameter oPrm; 
oPrm = cmd.CreateParameter(); 
oPrm.ParameterName = ":myDate"; 
oPrm.OracleDbType = OracleDbType.Date; 
oPrm.Value = DateTime.Now; //for date 
cmd.Parameters.Add(oPrm); 
相關問題