我正在使用 OleDbConnection 查询 Excel 2007 电子表格。我想强制 OleDbDataReader 仅使用字符串作为列数据类型。
系统正在查看前 8 行数据并推断数据类型为 Double。问题是,在第 9 行,我在该列中有一个字符串,并且 OleDbDataReader 返回 Null 值,因为它无法转换为 Double。
我使用了这些连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 12.0;IMEX=1;HDR=No"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="ExcelFile.xlsx";Persist Security Info=False;Extended Properties="Excel 8.0;HDR=No;IMEX=1"
查看 reader.GetSchemaTable().Rows[7].ItemArray[5],它的 dataType 是 Double。
此架构中的第 7 行与我遇到问题的 Excel 中的特定列相关。ItemArray[5] 是它的 DataType 列
是否可以为阅读器创建自定义 TableSchema,以便在访问 ExcelFiles 时,我可以将所有单元格视为文本,而不是让系统尝试推断数据类型?
我在这个页面找到了一些很好的信息:使用 ADO.NET 阅读 Excel 电子表格的提示
ADO.NET 接口的主要特点是如何处理数据类型。(您会注意到,在阅读电子表格时,我一直在小心避免返回哪些数据类型的问题。)您准备好了吗?ADO.NET 扫描前 8 行数据,并据此猜测每列的数据类型。然后它会尝试将该列中的所有数据强制转换为该数据类型,只要强制失败就返回 NULL!
谢谢你,
基思
这是我的代码的简化版本:
using (OleDbConnection connection = new OleDbConnection(BuildConnectionString(dataMapper).ToString()))
{
connection.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = connection;
cmd.CommandText = SELECT * from [Sheet1$];
using (OleDbDataReader reader = cmd.ExecuteReader())
{
using (DataTable dataTable = new DataTable("TestTable"))
{
dataTable.Load(reader);
base.SourceDataSet.Tables.Add(dataTable);
}
}
}
}