当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用DataReader和OLEDBJet数据提供程序读取CSV文件时,如何控制列数据类型?》经验,为你挑选了3个好方法。

在我的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将列解释为字符串而不是数字?



1> Rory MacLeod..:

为了扩展Marc的答案,我需要创建一个名为Schema.ini的文本文件,并将其放在与CSV文件相同的目录中.除列类型外,此文件还可以指定文件格式,日期时间格式,区域设置以及列名称(如果它们未包含在文件中).

为了使我在问题工作中给出的示例,Schema文件应如下所示:

[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 Library中搜索"Schema.ini文件".



2> MarcE..:

你可以创建一个模式文件来告诉ADO.NET如何解释CSV - 实际上是给它一个结构.

试试这个:http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx



3> Akhil..:

请检查

http://kbcsv.codeplex.com/

using (var reader = new CsvReader("data.csv"))
{
    reader.ReadHeaderRecord();
    foreach (var record in reader.DataRecords)
    {
        var name = record["Name"];
        var age = record["Age"];
    }
}

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有