当我读取一个巨大的FoxPro .DBF时,如何使用VFPOLEDB提供程序来使用.NDX / .CDX索引?

时间:2014-09-05 16:20:36

标签: c# sql foxpro visual-foxpro

我在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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-2)

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