如何将只有一年(可能是字符串)的单元格转换为DateTime数据类型?

时间:2017-03-29 07:37:58

标签: c# datetime datagridview insert converter

我在Excel文件中包含了包含以下数据的单元格:

“2006”, “2005”, “2015”

暂时读入datagridview,稍后将其插入到访问数据库中,如下所示:

using (OleDbConnection conn = new OleDbConnection(Con))
{
    using (OleDbCommand cmd = new OleDbCommand())
    {
        cmd.Connection = conn;
        conn.Open();
        cmd.CommandText =
        "Insert INTO ACTB (ID,Business,Account,Description,Span_Year,Period,Amount_PHP,Project_Number,Status_Regime,Department,Description_Dept,Accounts,Class) " +
        "VALUES(@ID,@Business,@Account,@Description,@Span_Year,@Period,@Amount_PHP,@Project_Number,@Status_Regime,@Department,@Description_Dept,@Accounts,@Class)";
        for (int s = 0; s < DGVExcel.Rows.Count; s++)
        {
            cmd.Parameters.Clear();
            int theDoubleDate = Convert.ToInt32(DGVExcel.Rows[s].Cells[4].Value);
            DateTime theDate = DateTime.FromOADate(theDoubleDate);
            cmd.Parameters.AddWithValue("@ID", DGVExcel.Rows[s].Cells[0].Value);
            cmd.Parameters.AddWithValue("@Business_Unit", DGVExcel.Rows[s].Cells[1].Value);
            cmd.Parameters.AddWithValue("@Account", DGVExcel.Rows[s].Cells[2].Value);
            cmd.Parameters.AddWithValue("@Description", DGVExcel.Rows[s].Cells[3].Value);
            cmd.Parameters.AddWithValue("@Span_Year", theDate);
            cmd.Parameters.AddWithValue("@Period", DGVExcel.Rows[s].Cells[5].Value);
            cmd.Parameters.AddWithValue("@Amount_PHP", DGVExcel.Rows[s].Cells[6].Value == null ? 0 : Convert.ToDouble(DGVExcel.Rows[s].Cells[6].Value));
            cmd.Parameters.AddWithValue("@Project_Number", DGVExcel.Rows[s].Cells[7].Value);
            cmd.Parameters.AddWithValue("@Status_Regime", DGVExcel.Rows[s].Cells[8].Value);
            cmd.Parameters.AddWithValue("@Department", DGVExcel.Rows[s].Cells[9].Value);
            cmd.Parameters.AddWithValue("@Description_Dept", DGVExcel.Rows[s].Cells[10].Value);
            cmd.Parameters.AddWithValue("@IS_Accounts", DGVExcel.Rows[s].Cells[11].Value);
            cmd.Parameters.AddWithValue("@ITR_Class", DGVExcel.Rows[s].Cells[12].Value);
            cmd.ExecuteNonQuery();
        }
    }
}

但是,这些值写错了,比如8/7/1905都以1905年结束。

另一个要求是最终值是日和月不可知的,这意味着该值将如下所示:2016 =&gt; 2016年1月1日,就在数据插入数据库之前。有些人建议我只使用int值,但是,我需要datetime,因为我打算使用between关键字在特定时段之间轻松查找数据。

编辑:我刚刚意识到我的一些数据可能没有列出一年。通常情况下,我可以很好地插入空值,但是,如果我在此之前进行一些转换,我确信它会抛出异常,例如无法将DB.Null转换为其他类型。

1 个答案:

答案 0 :(得分:2)

您可以检查单元格中是否有值,然后创建新的DateTime

if (string.IsNullOrEmpty(DGVExcel.Rows[s].Cells[3].Value))
{
    cmd.Parameters.AddWithValue("@Span_Year", DateTime.Now.Date);
}
else
{
    cmd.Parameters.AddWithValue("@Span_Year", new DateTime(Convert.ToInt32(DGVExcel.Rows[s].Cells[3].Value), 1, 1);
}

我还建议在参数中指定数据类型,这样可以提供更多类型安全性并防止日期时间转换错误。

cmd.Parameters.Add("@ID", SqlDbType.Int).Value = 45;
cmd.Parameters.Add("@Span_Year", SqlDbType.DateTime).Value = date;