当我尝试插入日期和日期时出现ORA-01843到甲骨文的时间

发布于 2024-08-07 23:09:17 字数 272 浏览 7 评论 0原文

我有字符串格式的 A anb B

A = 14/01/2007

B = 22:10:39

我尝试插入日期和时间:

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

我收到 ORA-01843 错误,我能做什么?

提前致谢

I have A anb B in String format

A = 14/01/2007

B = 22:10:39

I try to insert date and time:

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

i got ORA-01843 error, what I can do ?

thank's in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

街角迷惘 2024-08-14 23:09:17

不要使用原始 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();
}

显然要调整为您实际字段的类型。)

Don't use raw SQL to insert values. Use a parameterized query instead. Parse your strings into .NET DateTime (or DateTimeOffset) and TimeSpan values in the normal way, and then use something like:

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();
}

(Obviously adjust for the types of your actual fields.)

离去的眼神 2024-08-14 23:09:17

错误是由于月份引起的,请尝试:

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

The error is due to the month, try:

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

你不是我要的菜∠ 2024-08-14 23:09:17

请记住,Oracle 没有仅时间字段。

您正在尝试将仅时间字段插入到日期时间中。我的猜测是,CLR 正在将 B 转换为 00/00/00 22:10:39,这不是有效的 Oracle 日期。例如:

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 ("

...但我猜这只是一个错字。

Remember that Oracle doesn't have a time-only field.

You're trying to insert a time-only field into a datetime. My guess is that the CLR is turning B into 00/00/00 22:10:39, which isn't a valid oracle date. For example:

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

Either way, Convert.ToDateTime(B) probably isn't returning the right thing.

Also, this:

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

should be this:

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

...but I'm guessing that's just a typo here.

南薇 2024-08-14 23:09:17

然而我尝试了乔恩的方法,它对我来说对于日期和时间都不起作用。所以我找到了这个日期时间方法。也许这对未来的某个人也有帮助。

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

However i tried Jon method, it didnt work for me for date also time. So i found this method for datetime. Maybe that helps someone in next future too.

OracleParameter oPrm;
oPrm = cmd.CreateParameter();
oPrm.ParameterName = ":myDate";
oPrm.OracleDbType = OracleDbType.Date;
oPrm.Value = DateTime.Now;  //for date
cmd.Parameters.Add(oPrm);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文