Excel Jet OLE DB:插入DateTime值

OLEDB可用于读取和写入Excel工作表。 考虑下面的代码示例:

using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\my\\excel\\file.xls;Extended Properties='Excel 8.0;HDR=Yes'")) { conn.Open(); OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] datetime)", conn); cmd.ExecuteNonQuery(); cmd = new OleDbCommand("INSERT INTO Sheet1 VALUES (@mydate)", conn); cmd.Parameters.AddWithValue("@mydate", DateTime.Now.Date); cmd.ExecuteNonQuery(); } 

这工作得很好。 插入数字,文字等也很好。 但是,插入时间组件的值将失败:

 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\my\\excel\\file.xls;Extended Properties='Excel 8.0;HDR=Yes'")) { conn.Open(); OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] datetime)", conn); cmd.ExecuteNonQuery(); cmd = new OleDbCommand("INSERT INTO Sheet1 VALUES (@mydate)", conn); cmd.Parameters.AddWithValue("@mydate", DateTime.Now); // <-- note the difference here cmd.ExecuteNonQuery(); } 

在条件expression式中执行此INSERT失败,出现OleDbException: 数据types不匹配。

这是一个已知的错误? 如果是的话,可以做些什么来解决这个问题呢? 我find了一个可行的解决方法:

 cmd = new OleDbCommand(String.Format(@"INSERT INTO Sheet1 VALUES (#{0:dd\/MM\/yyyy HH:mm:ss}#)", DateTime.Now), conn); 

它基本上创build一个如下所示的SQL语句: INSERT INTO Sheet1 VALUES (#05/29/2011 13:12:01#) 。 当然,我不必告诉你这是多么丑陋。 我宁愿有一个参数化查询解决scheme。

它似乎是一个已知的错误https://connect.microsoft.com/VisualStudio/feedback/details/94377/oledbparameter-with-dbtype-datetime-throws-data-type-mismatch-in-criteria-expression

您可能想要像这样截断毫秒,它似乎工作OleDbParameter:

 DateTime org = DateTime.UtcNow; DateTime truncatedDateTime = new DateTime(org.Year, org.Month, org.Day, org.Hour, org.Minute, org.Second); 

并将此代替DateTime.Now添加到您的参数值中。

问题是包含datetime值的单元格不能直接放入excel列中。 您必须插入date组件或时间组件。 失败的原因是Excel中的默认属性“单元格是”值“而不是”date时间“在Excel中。