c# - 使用 DataReader 和 OLEDB Jet 数据提供程序读取 CSV 文件时,如何控制列数据类型?

标签 c# .net csv oledb

在我的 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/

相关文章:

c# - IIS 覆盖 ASP.NET 中的自定义 404 错误页面

c# - 如何在 C#.NET 中获得准确的下载/上传速度?

c# - app.config 分离实现

c# - 以编程方式将访问控制列表 (ACL) 权限分配给 'this folder, subfolders and files'

ios - 架构 i386 的 undefined symbol : "_OBJC_CLASS_$_CkoCsv"

c# - 绑定(bind)运行次数可变的 RichTextBox

c# - 如何在 WebAPI 中返回 404 和 403 的 json?

mysql - LOAD DATA LOCAL INFILE 命令不导入任何数据

c# - 在 C# 中从 WebClient 读取响应 header

python - 如何在不导出到 csv 的情况下(重新)命名 Pandas 数据框中的空列标题