Получил ORA-01843, когда я пытаюсь вставить дату и время в Oracle
У меня есть A anb B в формате String
A = 14/01/2007
B = 22:10:39
Я пытаюсь вставить дату и время:
SQL = "insert into MyTbl(Tdate,Ttime) value ('" + Convert.ToDateTime(A) + "','" + Convert.ToDateTime(B) + "')";
я получил ошибку ORA-01843, что я могу сделать?
заранее спасибо
4 ответа
Ошибка связана с месяцем, попробуйте:
TO_DATE (A, 'ДД / ММ / ГГГГ')
Не используйте сырой 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();
}
(Очевидно, отрегулируйте для типов ваших фактических полей.)
Однако я попробовал метод Джона, он не работал для меня на дату и время. Так что я нашел этот метод для datetime. Может быть, это поможет кому-то в будущем.
OracleParameter oPrm;
oPrm = cmd.CreateParameter();
oPrm.ParameterName = ":myDate";
oPrm.OracleDbType = OracleDbType.Date;
oPrm.Value = DateTime.Now; //for date
cmd.Parameters.Add(oPrm);
Помните, что у 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 ("
... но я предполагаю, что это просто опечатка здесь.