【发布时间】: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