Excel Jet OLE DB: Inserting a DateTime value
本文关键字:DateTime value Inserting Jet OLE DB Excel | 更新日期: 2023-09-27 17:58:33
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();
}
执行此INSERT失败,原因是标准表达式中的OleDbException:数据类型不匹配
这是一个已知的bug吗?如果是,可以做些什么来解决它?我找到了一个可行的解决方法:
cmd = new OleDbCommand(String.Format(@"INSERT INTO Sheet1 VALUES (#{0:dd'/MM'/yyyy HH:mm:ss}#)", DateTime.Now), conn);
它基本上创建了一个SQL语句,如下所示:INSERT INTO Sheet1 VALUES (#05/29/2011 13:12:01#)
。当然,我不必告诉你这有多难看。我更希望有一个参数化查询的解决方案。
这似乎是一个已知的错误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添加到您的参数值中。
问题是包含日期时间值的单元格不能直接放入excel的列中。您必须插入日期组件或时间组件。失败的原因是excel单元格的默认属性是"值",而不是excel中的"日期时间"。