Tenho ORA-01843 quando tento inserir data e hora para o Oracle
Pergunta
Eu tenho um ANB B em formato de string
A = 14/01/2007
B = 22:10:39
Eu tento inserir data e hora:
SQL = "insert into MyTbl(Tdate,Ttime) value ('" + Convert.ToDateTime(A) + "','" + Convert.ToDateTime(B) + "')";
Recebi o erro ORA-01843, o que posso fazer?
desde já, obrigado
Solução
O erro é devido ao mês, tente:
To_date (a, 'dd/mm/aaaa')
Outras dicas
Não use SQL bruto para inserir valores. Use uma consulta parametrizada. Analise suas cordas no .net DateTime
(ou DateTimeOffset
) e TimeSpan
valores da maneira normal e depois usam algo como:
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();
}
(Obviamente, ajuste os tipos de seus campos reais.)
Lembre-se de que o Oracle não tem um campo apenas de tempo.
Você está tentando inserir um campo apenas de tempo em um datetime. Meu palpite é que o CLR está transformando B em 00/00/00 22:10:39, que não é uma data válida do Oracle. Por exemplo:
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
De qualquer forma, o convert.todateTime (b) provavelmente não está retornando a coisa certa.
Além disso, isso:
"insert into MyTbl(Tdate,Ttime) value ("
deve ser o seguinte:
"insert into MyTbl(Tdate,Ttime) values ("
... Mas acho que isso é apenas um erro de digitação aqui.
No entanto, tentei o método Jon, não funcionou para mim para a data também. Então, encontrei esse método para o DateTime. Talvez isso ajude alguém no próximo futuro também.
OracleParameter oPrm;
oPrm = cmd.CreateParameter();
oPrm.ParameterName = ":myDate";
oPrm.OracleDbType = OracleDbType.Date;
oPrm.Value = DateTime.Now; //for date
cmd.Parameters.Add(oPrm);