Hei*_*nzi 2 .net c# oledb excel 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();
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好。插入数字、文本等也效果很好。但是,插入带有时间分量的值会失败:
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();
}
Run Code Online (Sandbox Code Playgroud)
执行此 INSERT 失败并出现 OleDbException:条件表达式中的数据类型不匹配。
这是一个已知的错误?如果是,可以采取什么措施来解决这个问题?我找到了一种有效的解决方法:
cmd = new OleDbCommand(String.Format(@"INSERT INTO Sheet1 VALUES (#{0:dd\/MM\/yyyy HH:mm:ss}#)", DateTime.Now), conn);
Run Code Online (Sandbox Code Playgroud)
它基本上创建一个如下所示的 SQL 语句:INSERT INTO Sheet1 VALUES (#05/29/2011 13:12:01#)。当然,我不必告诉你这有多丑陋。我更愿意有一个带有参数化查询的解决方案。
您可能想要截断毫秒,如下所示,它似乎适用于 OleDbParameter:
DateTime org = DateTime.UtcNow;
DateTime truncatedDateTime = new DateTime(org.Year, org.Month, org.Day, org.Hour, org.Minute, org.Second);
Run Code Online (Sandbox Code Playgroud)
并将其添加到您的参数值中,而不是 DateTime.Now 中。
| 归档时间: |
|
| 查看次数: |
6329 次 |
| 最近记录: |