在我的 C# 应用程序中,我使用 Microsoft Jet OLEDB 数据提供程序来读取 CSV 文件。连接字符串如下所示:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Data;Extended Properties="text;HDR=Yes;FMT=Delimited
我使用该连接字符串打开 ADO.NET OleDbConnection 并使用以下命令从 CSV 文件中选择所有行:
select * from Data.csv
当我打开 OleDbDataReader 并检查它返回的列的数据类型时,我发现堆栈中的某些内容试图根据文件中的第一行数据来猜测数据类型。例如,假设 CSV 文件包含:
House,Street,Town
123,Fake Street,Springfield
12a,Evergreen Terrace,Springfield
调用 House 列的 OleDbDataReader.GetDataTypeName 方法将显示该列已被赋予数据类型“DBTYPE_I4”,因此从中读取的所有值都被解释为整数。我的问题是 House 应该是一个字符串 - 当我尝试从第二行读取 House 值时,OleDbDataReader 返回 null。
我如何告诉 Jet 数据库提供程序或 OleDbDataReader 将列解释为字符串而不是数字?
最佳答案
为了扩展 Marc 的回答,我需要创建一个名为 Schema.ini 的文本文件并将其放在与 CSV 文件相同的目录中。除了列类型外,此文件还可以指定文件格式、日期时间格式、区域设置和列名称(如果文件中未包含这些名称)。
要使我在问题中给出的示例有效,架构文件应如下所示:
[Data.csv]
ColNameHeader=True
Col1=House Text
Col2=Street Text
Col3=Town Text
我也可以尝试让数据提供者在尝试猜测数据类型之前检查文件中的所有行:
[Data.csv]
ColNameHeader=true
MaxScanRows=0
在现实生活中,我的应用程序从具有动态名称的文件中导入数据,因此我必须动态创建一个 Schema.ini 文件,并在打开连接之前将其写入与 CSV 文件相同的目录。
可在此处找到更多详细信息 - http://msdn.microsoft.com/en-us/library/ms709353(VS.85).aspx - 或者通过在 MSDN 库中搜索“Schema.ini 文件”。
关于c# - 使用 DataReader 和 OLEDB Jet 数据提供程序读取 CSV 文件时,如何控制列数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/115658/