2009-10-14 3 views
3

У меня есть АНБ B в формате Строкаполучил 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

Не используйте raw 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/en-us/library/system.data.oracleclient.oraclecommand.aspx) теперь похоже, что OracleCommand устарел. – ssgao

1

Помните, что Oracle не имеет поля времени.

Вы пытаетесь вставить поле времени только в datetime. Я предполагаю, что 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

Однако я попробовал метод Джона, он не работал для меня даты и времени. Поэтому я нашел этот метод для datetime. Возможно, это поможет и кому-то в следующем будущем.

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