DBF大字段

时间:2009-04-16 06:23:06

标签: oledb dbf clipper

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

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

以下是我用来读取表格的示例代码段,其中包含两个用于读取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;
                    }
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:3)

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

我认为Clipper以前做的是修改Field结构,以便在字符字段中,小数位数保持大小的高位字节,因此字符字段大小实际上是256 *小数+大小。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

2 - 尝试FoxPro OLEDB provider

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

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