在 C# 中使用 IDataReader 读取 dbf 文件

Posted

技术标签:

【中文标题】在 C# 中使用 IDataReader 读取 dbf 文件【英文标题】:Using IDataReader for reading dbf file in C# 【发布时间】:2011-07-08 05:54:02 【问题描述】:

我正在尝试使用 OleDb 使用 datareader 读取 .dbf 文件,如下所示:

const string OleDbConnectionString =
    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydbase;Extended Properties=dBASE IV;";
    var connection = new OleDbConnection(OleDbConnectionString);
    connection.Open();

    var command = new OleDbCommand("select * from my.dbf", connection);

    reader = command.ExecuteReader();
    Console.WriteLine(reader.Read()); // true
    Console.WriteLine(reader[0].ToString()); // exception

InvalidCastException 类型的例外情况是:无法从System.__ComObject 区分大小写到IRowset。 当我尝试使用 OleDbAdapter 填充表格时,一切正常。 如何使用 IDataReader 读取 .dbf 文件?

【问题讨论】:

您的选择命令中的my.dbf 是什么?如果不是,那应该是表名吗? 【参考方案1】:

我认为你的路径可能是错误的,因为你在连接字符串中有“C:\mybase”,然后添加“my.dbf”,它加起来就是“C:\mybasemy.dbf”。

我将提供如何使用数据集而不是阅读器打开和读取 dbf 的代码。

string oledbConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\spcs\;Extended Properties=dBASE IV;User ID=Admin;Password=";

        OleDbConnection oledbConnection = new OleDbConnection(oledbConnectionString);

        string oledbQuery = @"SELECT * FROM KUND";

        try
        
            OleDbCommand oledbCommand = new OleDbCommand(oledbQuery, oledbConnection);

            OleDbDataAdapter oledbAdapter = new OleDbDataAdapter(oledbCommand);

            DataSet oledbDataset = new DataSet();

            oledbAdapter.FillSchema(oledbDataset, SchemaType.Mapped);

            oledbConnection.Open();

            oledbAdapter.Fill(oledbDataset);

            foreach (DataRow row in oledbDataset.Tables[0].Rows)
            
                System.Diagnostics.Trace.WriteLine(row[0].ToString());
            
        
        catch (Exception ex)
        
            // Do something with ex
        

【讨论】:

感谢您的回答。但我需要使用数据阅读器,而不是数据集。【参考方案2】:

好的,尝试使用 GetString:

const string OleDbConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydbase;Extended Properties=dBASE IV;";
OleDbConnection connection = new OleDbConnection(OleDbConnectionString);
connection.Open();

OleDbCommand command = new OleDbCommand("select * from my.dbf", connection);

OleDbDataReader reader = command.ExecuteReader();
Console.WriteLine(reader.Read()); // true
Console.WriteLine("0", reader.GetString(0)); // exception

【讨论】:

选择命令不是问题。我使用具有相同连接字符串的 DataAdapter 来完成所有工作。我尝试了您的建议 - 结果是相同的异常。 @StuffHappens 我刚刚在我自己的 DBF 上运行了你的代码,它工作正常,你能把 reader.GetString(0));在 try/catch 中并提供异常信息?是不是不能转成字符串的值? @StuffHappens 您发布的第一个代码也对我有用,这可能与您的 DBF 文件有关吗? 是的,可能 dbf 文件不正确,即使我可以使用 DataAdaper 打开它。

以上是关于在 C# 中使用 IDataReader 读取 dbf 文件的主要内容,如果未能解决你的问题,请参考以下文章

引发了“System.OutOfMemoryException”类型的异常。 C# 使用 IDataReader 时

c# IDataReader SqlDataReader 区别

C# - IDataReader 到使用泛型的对象映射

利用反射将IDataReader读取到实体类中效率低下的解决办法

AutoMapper:在运行时读取 Mapper 配置?

如何在 System.Data.IDataReader 中模拟 GetValues() 方法?