【问题标题】:How do I use the VFPOLEDB Provider to make use of the .NDX/.CDX indexing when I read a huge FoxPro .DBF?当我阅读巨大的 FoxPro .DBF 时,如何使用 VFPOLEDB 提供程序来利用 .NDX/.CDX 索引?
【发布时间】:2014-09-05 16:20:36
【问题描述】:

我正在用 C# 编写一个 .NET 应用程序,它使用 Visual FoxPro OLE DB 提供程序 (VFPOLEDB.1) 读取 FoxPro .DBF。

问题是 .DBF 为 900MB,因此与从 FoxPro 瞬时读取(我们使用 DOS FoxPro)相比,简单读取需要的时间太长。提供者和原生 FoxPro 搜索之间的区别在于,我假设 FoxPro 使用索引文件(我们使用 .CDX 和 .NDX),提供者使用给定的 SQL 语句进行线性搜索。

public DataTable getData(string refNum = "TESTREFNUM")
{

    DataTable result = new DataTable();

    OleDbConnection connection = new OleDbConnection(
            "Provider=VFPOLEDB.1;Data Source=C:\\PATH\\TO\\DBFFILES\\;Exclusive=No");

        connection.Open();

        if (connection.State == ConnectionState.Open)
        {
            string mySQL = "SELECT DP_PRO, DP_FILE, DP_NUM"
                + "FROM DISPATCH"                           // 900MB dispatch.dbf
                + "WHERE DP_PRO LIKE '%" + refNum + "%'";

            OleDbCommand MyQuery = new OleDbCommand(mySQL, connection);
            OleDbDataAdapter DA = new OleDbDataAdapter(MyQuery);

            DA.Fill(result);

            connection.Close();
        }
    return result;
}

所以根据我的研究,我发现对 .CDX 文件的支持比对 .NDX 文件的支持要多,这很好。但是如何设置 OleDBConnection 以使用索引,除了通过文件默认的慢速搜索?

我必须对 SQL 语句进行任何更改吗?还是提供者?或更改 DBF 文件的设置?通过研究,我还发现 .CDX 引用位于 .DBF 文件的标头中,因此提供者知道关联了哪些 .CDX 文件应该不是问题。

任何帮助都会非常感激。我是一个没有 FoxPro 经验的应届毕业生。 :p

【问题讨论】:

  • 您的问题是否与使用.NDX.CDX 有关。前者必须手动打开,对数据库使用 SQL 查询时不使用 IIRC。后者在打开数据库时自动打开,并在执行 SQL 查询时自动使用适当的索引(如果存在)。 (您的标题同时提到了 .NDX/.CDX。当查询运行时,知道哪个数据库专门用于您在 SQL 查询中使用的数据库与问题相关。)
  • 我可以将 .NDX 或 .CDX 中的索引设置到数据库中,我的问题是 Ole DB 是否支持其中任何一个以及我是否可以使用它们。从答案和研究中,我看到 .CDX 有更好的支持并且是自动使用的。
  • 另外,为了回答您的问题,我正在使用的数据库同时具有 .NDX 和 .CDX 索引,它们索引的字段之间存在一些重叠。

标签: c# sql foxpro visual-foxpro


【解决方案1】:

就复合索引(CDX)而言,您希望确保查询是 Rushmore 优化的。这就是您需要做的所有事情 - 如果有问题的表存在 CDX(如 DBF 的标题中所示),那么它将被自动使用。查看上面的示例,因此假设字段 DP_PRO 上没有索引标记。

【讨论】:

  • 哇哦!我刚刚意识到 SQL 语句中的两个通配符 '%' 是导致搜索速度变慢的原因。它限制了用户可以输入的内容,因为它们现在必须是精确的值,但如果它使程序更快,我们将继续这样做。谢谢艾伦。
  • 这很奇怪,因为该类型的查询应该是可优化的,但您可能需要以某种方式构建索引。将其标记为已回答是吗? :)
【解决方案2】:

VFPOLEDB 提供程序根本不支持索引。

【讨论】:

  • 您有什么可以支持这一说法的吗? Alan B 的回答和随附的 cmets 另有说明。 (而且 INDEX 甚至在 list of supported OLE DB commands
  • 尝试通过 SQL & VFPOLEDB 创建索引。但是,this 解决方法对您很有用。
  • 虽然通过VFPOLEDB创建索引可能很困难,但这与“根本不支持索引”不同;例如,已经存在的索引可用于优化 SQL 查询。
  • 谢谢肯,我会再检查一遍。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2011-04-06
相关资源
最近更新 更多