【问题标题】:DateTime format wrong C# , Oracle日期时间格式错误 C# , Oracle
【发布时间】:2013-03-02 10:03:21
【问题描述】:

在我的应用程序中,我捕获了一个“时间戳”。我稍后在调用存储过程时使用此时间戳。目前我收到错误:

ORA-01830: 日期格式图片在转换整个输入之前结束 字符串 ORA-06512:在第 2 行

我需要小时、分钟和秒,因为表中的列必须是唯一的。

这是我获取日期时间的方法:

private void getDate()
    {
        conn.Open();
        string query;
        query = "select to_char(sysdate, 'dd/mon/yyyy hh24:mi:ss') as CurrentTime from dual";
        OracleCommand cmd = new OracleCommand(query, conn);
        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();
        text = dr[0].ToString();
        dr.Close();
        conn.Close();
    }

这就是我调用该过程的方式:

        OracleCommand cmd = new OracleCommand();
        cmd.Connection = conn;
        conn.Open();
        OracleTransaction trans = conn.BeginTransaction();
        cmd.CommandTimeout = 0;
        cmd.CommandText = "dc.hhrcv_insert_intrnl_audit_scn";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("pn_pallet_id", OracleDbType.Number).Value = palletid;
        cmd.Parameters.Add("pn_emp_id_no", OracleDbType.Number).Value = empid;
        cmd.Parameters.Add("pd_intrnl_audit_scan_datetime", OracleDbType.VarChar).Value = text;
        cmd.Parameters.Add("pn_company_id_no", OracleDbType.VarChar).Value = companyIdNo2;
        cmd.Parameters.Add("pn_order_no", OracleDbType.Number).Value = orderNo2;
        cmd.Parameters.Add("pn_carton_code", OracleDbType.Number).Value = carton_Code2;
        cmd.Parameters.Add("pn_no_of_full_carton", OracleDbType.Number).Value = txtNoOfCartons.Text;
        cmd.Parameters.Add("pn_no_of_packs", OracleDbType.Number).Value = txtNoOfPacks.Text;
        cmd.Parameters.Add(new OracleParameter("pv_error", OracleDbType.VarChar));
        cmd.Parameters["pv_error"].Direction = ParameterDirection.Output;
        string pv_error;
        cmd.ExecuteNonQuery();
        pv_error = cmd.Parameters["pv_error"].Value.ToString();
        if (pv_error.ToString() == "")
        {
            trans.Commit();
            frmMsgAudit ms = new frmMsgAudit(empid,palletid,orderno,text);
            ms.Show();
            this.Hide();
        }
        else
        {
            trans.Rollback();
            MessageBox.Show("" + pv_error, "Error");
        }
        conn.Close();

得到错误:

cmd.ExecuteNonQuery();

ORA-01830: 日期格式图片在转换整个输入之前结束 字符串 ORA-06512:在第 2 行

提前致谢。

【问题讨论】:

  • stredprocedure 中参数的数据类型是什么?一个 varchar2 ?
  • 错误来自您的程序吗?如果是这样,请也发布您的程序代码。实际上,如果您使用的是 oracle 11.0.2.3 或更高版本,我建议您使用实体框架。

标签: c# oracle datetime stored-procedures


【解决方案1】:

感谢所有快速回复!

grrr .. 我真的需要坐下来一步一步地走一遍!无论如何,这就是问题所在:

在存储过程中我有:

...
begin
insert into dc_internal_audit_scan (pallet_id_no,
                                    internal_audit_scan_emp,
                                    internal_audit_scan_datetime,
                                    company_id_no,
                                    order_no,
                                    carton_code,
                                    no_of_full_cartons,
                                    no_of_packs,
                                    last_update_datetime,
                                    username)      
                            values (ln_pallet_id_no,
                                    pn_emp_id_no,
                                    **pd_intrnl_audit_scan_datetime,**
                                    pn_company_id_no,
                                    pn_order_no,
                                    pv_carton_code,
                                    pn_no_of_full_cartons,
                                    pn_no_of_packs,
                                    sysdate,
                                    lv_emp_username);
end; 

现在:

...
begin
insert into dc_internal_audit_scan (pallet_id_no,
                                    internal_audit_scan_emp,
                                    internal_audit_scan_datetime,
                                    company_id_no,
                                    order_no,
                                    carton_code,
                                    no_of_full_cartons,
                                    no_of_packs,
                                    last_update_datetime,
                                    username)      
                            values (ln_pallet_id_no,
                                    pn_emp_id_no,
                                    **TO_DATE(pd_intrnl_audit_scan_datetime,'dd/mon/yyyy hh24:mi:ss'),**
                                    pn_company_id_no,
                                    pn_order_no,
                                    pv_carton_code,
                                    pn_no_of_full_cartons,
                                    pn_no_of_packs,
                                    sysdate,
                                    lv_emp_username);
end; 

TO_DATE(pd_intrnl_audit_scan_datetime,'dd/mon/yyyy hh24:mi:ss')

谢谢

【讨论】:

  • 我认为这就是问题所在——oracle 根据NLS_DATE_FORAMT 隐式地将字符串转换为日期。 Here is a demo(我已经做了,为什么不添加它......)
【解决方案2】:

这行好像错了;

 query = "select to_char(sysdate, 'dd/mon/yyyy hh24:mi:ss')

24 在这里做什么?

试试看;

query = "select to_char(sysdate, 'dd/mon/yyyy hh:mi:ss AM')

来自ORA-01830 Error

您尝试输入日期值,但输入的日期不匹配 日期格式。

编辑:由于 ABCade warned mehh24 是有效的 oracle 格式,但我仍然相信您的 sysdate 格式和 'dd/mon/yyyy hh24:mi:ss' 是不同的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多