【问题标题】:DBF Large Char FieldDBF 大字符字段
【发布时间】:2009-06-14 07:00:19
【问题描述】:

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

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

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

这是我的连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\datadir;Extended Properties=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;
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: oledb dbf clipper


    【解决方案1】:

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

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

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

    【讨论】:

    • 其实,这就解释了为什么这个字段设置为小数点后两位。我很想看看你提到的课程。它在某处在线吗?
    • 我拿出一个十六进制编辑器查看了文件的内容。包含字段长度的字节是 0xEE 或十进制 238。所以 Marc,您的公式确实有效:256*2+238 = 750 现在让 Jet OLEDB 提供程序发挥作用并使用这些计算是另一回事。
    • 我发现这个库在解析 DBF 文件方面做得很好。它不进行上述计算,这是对 FieldLength 属性的简单代码更改。 code.google.com/p/dotnetdbf
    • 抱歉耽搁了,我的课不在线,这只是一个快速修复。如果您仍然需要它,我可以通过电子邮件发送给您。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      3 个可能值得一试的建议...

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

      2 - 试试FoxPro OLEDB provider

      3 - 手动解析 DBF 文件。例如here

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多