【问题标题】:Wrong date format C#, Oracle错误的日期格式 C#, Oracle
【发布时间】:2013-02-11 16:42:38
【问题描述】:

我正在尝试以正确的格式 (dd/mm/yyyy) 获取我的日期。目前它的格式为:MM-DD-YYYY HH24:MI:SS 当我将其更改为 dd/mm/yyyy 时,它可以在数据库(Oracle)中使用。一旦我在我的应用程序中运行它,我就会得到异常:IndexOutOfRange at :

this.InfoList9.Add(dr["start_rcv_datetime"].ToString());

请看下面我的代码。

public List<String> InfoList = new List<String>();

private void populatelblDate()
{
    conn.Open();
    string query;
    query = "select to_char(dg.start_rcv_datetime,'dd/mm/yyyy') from dc_pallet dp, dc_pallet_stock dps , dc_grv dg , sku s ,prod_size ps,colour c ,purch_order_carton_sku pocs , dc_crane_instruc dci where dps.pallet_id_no = '" + palletId.ToString() + "' and dp.pallet_id_no = dps.pallet_id_no and dg.dc_grv_id_no = dps.dc_grv_id_no and dg.order_no = dps.order_no and dg.company_id_no = dps.company_id_no and s.company_id_no = dps.company_id_no and s.company_id_no = dg.company_id_no and dps.company_id_no = c.company_id_no and dps.company_id_no = ps.company_id_no and s.prod_size_id_no = ps.prod_size_id_no and s.colour_id_no = c.colour_id_no and dps.company_id_no = ps.company_id_no and pocs.order_no = dps.order_no and pocs.carton_code = dps.carton_code and pocs.company_id_no = dps.company_id_no and pocs.sku_id_no = s.sku_id_no and dci.pallet_id_no(+) = dp.pallet_id_no";

    OracleCommand cmd = new OracleCommand(query, conn);
    OracleDataReader dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        this.InfoList.Add(dr["start_rcv_datetime"].ToString());
    }
    dr.Close();
    conn.Close();
}

private void frmInfo_Load(object sender, EventArgs e)
{ 
    populatelblDate();
    lbl1.Text = this.InfoList[0];
}

然后我还有一个上一个和下一个按钮...

【问题讨论】:

  • 题外话:您确定在 SQL 查询中需要所有这些联接吗?
  • :) 这不是整个查询

标签: c# oracle


【解决方案1】:

您的IndexOutOfRange 异常表明立即 问题是结果集不包含start_rcv_datetime 列 - 大概是因为to_char 转换。

不要在数据库端处理字符串。以DateTime 的形式获取值,然后在客户端 以任何你想要的格式对其进行格式化。

使用dr.GetDateTime 获取值,已从查询中删除to_char 部分:

query = "select dg.start_rcv_datetime from ...";

using (OracleCommand cmd = new OracleCommand(query, conn))
{
    using (OracleDataReader dr = cmd.ExecuteReader())
    {
        int dateColumn = dr.GetOrdinal("start_rcv_datetime");
        while (dr.Read())
        {
            DateTime date = dr.GetDateTime(0);
            // Or whatever - consider cultural implications
            string text = date.ToString("dd/MM/yyyy");
            InfoList.Add(text);
        }
    }
}

(注意using 语句 - 您应该始终确保清理与数据库相关的资源。)

【讨论】:

  • 只是在将数据从 Oracle 表传输到 Ms Sql 时添加我的案例。在源表 (Oracle) 中有一个 DATE 类型的字段。在传输期间,我使用了 ExecuteReader,并且该字段的值作为字符串写入目标表(Ms Sql)。但是,由于相关年份是 2032 年,后来在管道中被翻译为 1932 年。因此,对于这种情况,必须使用这种方法(获取字段类型,如果是日期,则相应地格式化)。
  • @Vladimir.RL:更好的解决方案是避免“作为字符串写入目标表的字段”部分。如果你没有任何格式和解析,那么这种事情很难发生......
【解决方案2】:

您的第一列没有名称,因此您无法使用 "start_rcv_datetime" 检索它

直接的解决方案是将sql更改为读取

query = "select to_char(dg.start_rcv_datetime,'dd/mm/yyyy') as start_rcv_datetime from dc_pallet dp, dc_pallet_stock dps , dc_grv dg , sku s ,prod_size ps,colour c ,purch_order_carton_sku pocs , dc_crane_instruc dci where dps.pallet_id_no = '" + palletId.ToString() + "' and dp.pallet_id_no = dps.pallet_id_no and dg.dc_grv_id_no = dps.dc_grv_id_no and dg.order_no = dps.order_no and dg.company_id_no = dps.company_id_no and s.company_id_no = dps.company_id_no and s.company_id_no = dg.company_id_no and dps.company_id_no = c.company_id_no and dps.company_id_no = ps.company_id_no and s.prod_size_id_no = ps.prod_size_id_no and s.colour_id_no = c.colour_id_no and dps.company_id_no = ps.company_id_no and pocs.order_no = dps.order_no and pocs.carton_code = dps.carton_code and pocs.company_id_no = dps.company_id_no and pocs.sku_id_no = s.sku_id_no and dci.pallet_id_no(+) = dp.pallet_id_no";

但是,您可以简单地将日期作为日期时间从数据库中返回,然后在结果上使用 string.Format

例如。

this.InfoList.Add(string.Format("{0:dd/MM/yyyy}", dr["start_rcv_datetime"]));

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多