c# - Excel Jet OLE DB : Inserting a DateTime value

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

最佳答案

这似乎是一个已知错误 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。

关于c# - Excel Jet OLE DB : Inserting a DateTime value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253906/

相关文章:

vba - Excel VBA 字典 : add matching criteria if the data doesn't match with dictionary

c# - 如何在 C# 中最小化/恢复窗口

c# - 无法通过 Unity 将数据写入 Firebase 数据库

c# - 如何继续从命名管道/流发送/读取消息

c# - A 类 DLL 不能转换为 B 类 DLL。 Type A originates.. from in the context LoadFrom

c# - 检查委托(delegate)是否为空

excel - 加快Excel中列的删除速度

c# - 如何将 .NET 标准库更改为 .NET 框架库?

c# - 判断对象是否被修改的最佳方法是什么?

java - 如何使用 apache poi 复制/写入特定行