ODBC驱动程序检测混合列的能力似乎有问题。我有这个专栏:
Value
-----
24
200
AM1
AM2
55
22
显然是混合型的。
当使用此连接字符串阅读它时:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dataSource};Persist Security Info=False;Extended Properties="Excel 12.0 Xml;HDR=YES"
然后尝试使用模式信息
DbDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly);
DataTable schemaTable = reader.GetSchemaTable();
reader.Close();
foreach (DataRow r in schemaTable.Rows)
{
new
{
ColumnName = r["ColumnName"].ToString(),
ColumnDataType = r["DataType"].ToString(),
ColumnOrdinal = (int)r["ColumnOrdinal"],
ColumnSize = (int)r["ColumnSize"]
};
}
这是可行的,因为ColumnDataType
将被System.String
填充,这是预期的。
但使用此连接字符串:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source={dataSource};Persist Security Info=False;Extended Properties="text;HDR=YES;FMT=Delimited"
ColumnDataType
最终总是被System.Int32
填充,这会给任何试图从提取的模式信息中假设任何东西的人带来一系列问题。
这是阅读CSV时的schema.ini
[file.csv]
Format=Delimited(,)
ColNameHeader=True
DateTimeFormat=yyyy-mm-dd hh:nn:ss
DecimalSymbol=.
CharacterSet=65001
我不知道为什么65001在那里使用,但我已经尝试了OEM和ANSI,没有去。我还尝试在阅读CSV时将IMEX=1
添加到连接字符串中,也没有。
有什么想法吗?这是驱动程序的限制吗?
1条答案
按热度按时间neekobn81#
在注册表中查找
HKLM\SOFTWARE\Microsoft\Office\[VERSION]\Access Connectivity Engine\Engines\
,并比较“Excel”和“Text”键上的值。在我的机器(VERSION=16.0)上,Excel键的ImportMixedTypes=“Text”,而“Text”键的ImportMixedTypes=“Majory Type”。因此,我假设文本驱动程序选择int
,因为大多数值都是int。当你试图读取其中一个文本值时,我希望它会产生一个空值。看起来这些值只能在注册表中修改,而不能在连接字符串中指定:Help with a OleDB connection string for excel files如果您将“Text”键ImportMixedTypes更改为“Text”,我怀疑它会解决您的问题。但是,由于它是计算机范围的设置,因此可能会破坏使用该驱动程序的其他代码。
我会建议找到一个替代的ACE驱动程序。有许多CSV和Excel库可用于.NET,它们不会有这些问题