Excel Jet OLE DB:插入DateTime值

时间:2011-06-06 14:54:53

标签: c# .net excel oledb jet

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:条件表达式中的数据类型不匹配。

这是一个已知的错误吗?如果是,可以采取哪些措施来解决它?我找到了一个有效的解决方法:

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#)。当然,我不必告诉你这是多么丑陋。我宁愿有一个带参数化查询的解决方案。

2 个答案:

答案 0 :(得分:4)

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

您可能希望截断这样的milisecond,它似乎适用于OleDbParameter:

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

并将此项而不是DateTime.Now添加到参数值中。

答案 1 :(得分:1)

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