我在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
答案 0 :(得分:2)
就复合索引(CDX)而言,您需要确保您的查询是Rushmore优化的。这就是你需要做的 - 如果有问题的表存在CDX(如DBF的标题所示),那么它将被自动使用。查看上面的示例,因此假设字段DP_PRO上没有索引标记。
答案 1 :(得分:-2)
VFPOLEDB提供程序根本不支持索引。