1

我有一个我相信是用 Clipper 创建的数据库文件,但不能肯定地说(我有 .ntx 文件用于索引,我知道这是 Clipper 使用的)。我正在尝试创建一个 C# 应用程序,它将使用 System.Data.OleDB 命名空间读取此数据库。

在大多数情况下,我可以成功阅读表格的内容,但有一个字段我不能。此字段称为 CTRLNUMS,定义为 CHAR(750)。我已经阅读了通过 Google 搜索找到的各种文章,这些文章建议必须通过与正常分配给字符串变量不同的过程来读取大于 255 个字符的字段。到目前为止,我还没有在我找到的方法上取得成功。

以下是我用来读取表格的示例代码片段,其中包括我用来读取 CTRLNUMS 字段的两个选项。即使字段中存储了 750 个字符,这两个选项都导致返回 238 个字符。

这是我的连接字符串:

提供者=Microsoft.Jet.OLEDB.4.0;数据源=c:\datadir;扩展属性=DBASE IV;

谁能告诉我从 DBF 文件中读取更大字段的秘密?

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();

    using (OleDbCommand cmd = new OleDbCommand())
    {
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = string.Format("SELECT ITEM,CTRLNUMS FROM STUFF WHERE ITEM = '{0}'", stuffId);

        using (OleDbDataReader dr = cmd.ExecuteReader())
        {
            if (dr.Read())
            {
                stuff.StuffId = dr["ITEM"].ToString();

                // OPTION 1
                string ctrlNums = dr["CTRLNUMS"].ToString();

                // OPTION 2
                char[] buffer = new char[750];
                int index = 0;
                int readSize = 5;
                while (index < 750)
                {
                    long charsRead = dr.GetChars(dr.GetOrdinal("CTRLNUMS"), index, buffer, index, readSize);

                    index += (int)charsRead;

                    if (charsRead < readSize)
                    {
                        break;
                    }
                }
            }
        }
    }
}
4

3 回答 3

3

您可以在此处找到 DBF 结构的描述:http ://www.dbf2002.com/dbf-file-format.html

我认为 Clipper 过去所做的是修改字段结构,以便在字符字段中,小数位保存大小的高位字节,因此字符字段大小实际上是 256*Decimals+Size。

我可能有一个读取 dbfs(本机不是 ADO/DAO)的 C# 类,可以对其进行修改以处理这种情况。如果您有兴趣,请告诉我。

于 2009-04-16T15:53:36.807 回答
1

你还在寻找答案吗?这是一次性工作还是需要定期做的事情?

我有一个 Python 模块,主要用于从各种 DBF 文件中提取数据……它还没有处理length_high_byte= decimal_placeshack,但这是一个微不足道的变化。我很乐意 (a) 与您分享此内容和/或 (b) 获取此类 DBF 文件的副本以进行测试。

稍后添加:添加了扩展长度功能,并针对我自己创建的文件进行了测试。提供与任何想测试它的人共享代码仍然有效。仍然有兴趣自己获取一些“真实”文件进行测试。

于 2009-06-07T22:41:16.220 回答
0

3 条建议可能值得一试...

1 - 使用 Access 创建到 DBF 文件的链接表,然后使用 .Net 访问 access 数据库中的表,而不是直接访问 DBF。

2 - 尝试FoxPro OLEDB 提供程序

3 - 手动解析 DBF 文件。例子在这里

我的猜测是#1 应该是最简单的,#3 会让你有机会微调你的咒骂技巧。:)

于 2009-04-16T14:24:34.443 回答