使用DataReader和OLEDB Jet数据提供程序读取CSV文件时,如何控制列数据类型?
在我的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将列解释为字符串而不是数字?
解决方案
我们可以创建一个架构文件,该文件将告诉ADO.NET如何有效解释CSV并为其提供结构。
试试这个:http://www.aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx
为了扩展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/zh-cn/library/ms709353(VS.85).aspx或者在MSDN库中搜索" Schema.ini文件"。