我在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转换为其他类型。
答案 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;