如何将只有一年(可能是字符串)的单元格转换为 DateTime 数据类型?
How do I convert a cell that has only a year (probably a string) into DateTime datatype?
我在 excel 文件中有单元格,其中包含如下数据:
"2006","2005","2015"
临时读入datagridview,之后插入access数据库,如下:
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
关键字轻松查找特定时间段之间的数据。
编辑:我刚刚意识到我的一些数据可能没有列出年份。通常,我可以很好地插入空值,但是,如果我在此之前进行一些转换,我确定它会抛出一个异常,如 Cannot convert DB.Null into other types.
您可以检查单元格中是否有值,然后新建一个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;
我在 excel 文件中有单元格,其中包含如下数据:
"2006","2005","2015"
临时读入datagridview,之后插入access数据库,如下:
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
关键字轻松查找特定时间段之间的数据。
编辑:我刚刚意识到我的一些数据可能没有列出年份。通常,我可以很好地插入空值,但是,如果我在此之前进行一些转换,我确定它会抛出一个异常,如 Cannot convert DB.Null into other types.
您可以检查单元格中是否有值,然后新建一个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;