簡體   English   中英

如何將只有一年(可能是字符串)的單元格轉換為DateTime數據類型?

[英]How do I convert a cell that has only a year (probably a string) into DateTime datatype?

我在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 => 1/1/2016,就在將數據插入數據庫之前。 有人建議我只使用int值,但是,我需要使用datetime,因為我打算使用between關鍵字輕松地查找某些時段之間的數據。

編輯:我只是意識到我的某些數據可能沒有列出一年。 通常,我可以很好地插入null,但是,如果在此之前進行一些轉換,我確定它將引發異常,例如無法將DB.Null轉換為其他類型。

您可以檢查單元格中是否有值,然后創建一個新的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);
}

我還建議在參數中指定數據類型,這將提供更多的類型安全性並防止datetime發生轉換錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM