插入表返回 ORA-01843:不是有效月份

Posted

技术标签:

【中文标题】插入表返回 ORA-01843:不是有效月份【英文标题】:insert in to table gives back ORA-01843: not a valid month 【发布时间】:2013-05-28 21:18:14 【问题描述】:

我需要通过 C#(Windows 窗体)在 oracle 中的表中插入一行

conn.Open();
OracleCommand cmd = new OracleCommand("INSERT INTO RECIPES(id,name,time_cooking,time_prep,price,directions,user_name,submit_timestamp) VALUES (:id, :name, :time_cook, :time_prep, :price, :directions, :user_name, :sub_time)",conn);
cmd.Parameters.AddWithValue(":id",x);
cmd.Parameters.AddWithValue(":name",textBox10.Text);
cmd.Parameters.AddWithValue(":time_cook", textBox9.Text);
cmd.Parameters.AddWithValue(":time_prep",textBox8.Text);
cmd.Parameters.AddWithValue(":price", textBox6.Text);
cmd.Parameters.AddWithValue(":directions",richTextBox2.Text);
cmd.Parameters.AddWithValue(":user_name",this.username);
cmd.Parameters.AddWithValue(":sub_time",DateTime.Now.ToString("MM/dd/yyyy"));

try

    cmd.ExecuteNonQuery();

catch (OracleException ex)

    MessageBox.Show(ex.ToString());


conn.Close();

我收到以下错误。

ORA-01843: 月份无效

我签入了oracle:

select * 
from nls_session_parameters;

并返回 NLS_DATE_FORMAT mm/dd/yyyy

【问题讨论】:

为什么要将日期转换为字符串? 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 【参考方案1】:

您不应该将日期作为字符串传递;您应该将其作为日期传递...只需删除 ToString 调用:

cmd.Parameters.AddWithValue(":sub_time", DateTime.Now);

如果您传递一个字符串,它将使用数据库中nls_date_format 参数指定的格式进行解析。如果您传递的格式不是数据库期望的格式,则解析将失败。通过传递日期本身,您无需担心格式。

【讨论】:

在进来的路上,会不会根据客户端上的设置解析,可能和服务端不匹配。我最近遇到了这个错误,因为我的用户输入了“05/27/2013”​​,而 Oracle 出于某种原因想要“27-MAY-2013”​​。原来,不是服务器抛出错误,而是她的机器。 @Jasmine,客户端上的设置仅在您将日期转换为客户端上的字符串时才重要...如果您将日期直接作为日期传递,则没有理由以任何方式格式化,因此客户端或服务器上的格式设置无效。

以上是关于插入表返回 ORA-01843:不是有效月份的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-01843:不是有效月份

“ORA-01843: 不是一个有效的月份”错误

ORA-01843 不是有效月份 - 比较日期

ORA-01843: 不是具有有效 SQL 查询的有效月份

ORA-01843: 不是一个有效的月份

ORA-01843 - 不是有效的月份 oracle SQL