如何使用 .CDX 文件读取 dbf?
How can i read dbf with .CDX files?
我正在用 C# 编写 .NET 应用程序。
该应用程序使用 Visual FoxPro OLEDB 提供程序读取 FoxPro .DBF。
允许您读取 .DBF 文件的功能不检测 .CDX 文件并且速度很慢query.How我可以用 .cdx 文件读取 .dbf 文件吗?
public DataTable ReadDbf(string path, string str_sql)
{
string constr = "Provider=VFPOLEDB;Data Source=" + path;
OleDbConnection con = new OleDbConnection();
con.ConnectionString = constr;
con.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(str_sql, con);
DataTable dt = new DataTable();
adapter.Fill(dt);
con.Close();
return dt;
}
我的路径和str_sql示例。
path ="C:\Users\kahla.mir\Desktop1901"
str_sql = Select * From 100307_fct where prodid = "000038" and srcid = "001190" and perid = "000001"
VFP OLEDB 提供程序自动打开、使用和维护结构 1 CDX 文件,就像 VFP IDE 和运行时引擎一样。
有几种情况会导致 CDX 不能用于加速查询:
- 存在 CDX 但不是结构性的
- Rushmore 已通过
SET OPTIMIZE OFF
禁用
- 查询不包含任何匹配索引键的可优化谓词
在这三种中,后者是迄今为止最常见的。管理拉什莫尔优化资格的规则可以在网络上的其他地方找到,例如在名为 Understanding Rushmore 的 Fox wiki 文章中。本质是谓词中使用的表达式必须匹配可用的索引表达式才能被优化。因此,除非您知道索引中的实际索引表达式是什么,否则您无法编写高效的查询。
在您的情况下,主索引很可能是涉及多个字段的复合表达式,例如
prodid - '|' - srcid - '|' - perid
如果你运气好,或者
prodid + srcid + perid
如果你不是。如果你找到类似 alltrim(prodid) + alltrim(srcid) + alltrim(perid)
的东西,那么唯一有效的办法就是拿起你的霰弹枪,在他造成更多伤害之前找到无知的肇事者。
如果你幸运的话,你可以像这样制定你的过滤条件以命中索引:
where prodid - '|' - srcid - '|' - perid == '000038|001190|000001'
密钥可以作为单个参数传递给 OLEDB(因此在 C# 中进行连接并传递单个字符串)或者 - 如果涉及一些不方便的框架 - 作为三个单独的参数,然后在查询本身中连接:
where prodid - '|' - srcid - '|' - perid == ? - '|' - ? - '|' - ?
在不幸的情况下,您必须确定字段宽度并相应地填充:
where prodid + srcid + perid == '000038 001190 000001'
或使用如下表达式:
where prodid + srcid + perid == padr('000038', 8) + padr('001190', 12) + '000001'
¹) 'structural' CDX 文件意味着 CDX 被视为 DBF 的结构部分,在这种情况下,它的名称(除了扩展名)将与DBF 的偏移量 0x1C(十进制 28)处的标志字节的第 0 位 header 将被设置,指示结构 CDX 的存在。如果 CDX 仅具有相同的名称,但 DBF header 中的 CDX 位未设置,则 CDX 将不会被视为结构 CDX(即,它将 而不是 打开并自动维护)。
我正在用 C# 编写 .NET 应用程序。 该应用程序使用 Visual FoxPro OLEDB 提供程序读取 FoxPro .DBF。
允许您读取 .DBF 文件的功能不检测 .CDX 文件并且速度很慢query.How我可以用 .cdx 文件读取 .dbf 文件吗?
public DataTable ReadDbf(string path, string str_sql)
{
string constr = "Provider=VFPOLEDB;Data Source=" + path;
OleDbConnection con = new OleDbConnection();
con.ConnectionString = constr;
con.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(str_sql, con);
DataTable dt = new DataTable();
adapter.Fill(dt);
con.Close();
return dt;
}
我的路径和str_sql示例。
path ="C:\Users\kahla.mir\Desktop1901"
str_sql = Select * From 100307_fct where prodid = "000038" and srcid = "001190" and perid = "000001"
VFP OLEDB 提供程序自动打开、使用和维护结构 1 CDX 文件,就像 VFP IDE 和运行时引擎一样。
有几种情况会导致 CDX 不能用于加速查询:
- 存在 CDX 但不是结构性的
- Rushmore 已通过
SET OPTIMIZE OFF
禁用
- 查询不包含任何匹配索引键的可优化谓词
在这三种中,后者是迄今为止最常见的。管理拉什莫尔优化资格的规则可以在网络上的其他地方找到,例如在名为 Understanding Rushmore 的 Fox wiki 文章中。本质是谓词中使用的表达式必须匹配可用的索引表达式才能被优化。因此,除非您知道索引中的实际索引表达式是什么,否则您无法编写高效的查询。
在您的情况下,主索引很可能是涉及多个字段的复合表达式,例如
prodid - '|' - srcid - '|' - perid
如果你运气好,或者
prodid + srcid + perid
如果你不是。如果你找到类似 alltrim(prodid) + alltrim(srcid) + alltrim(perid)
的东西,那么唯一有效的办法就是拿起你的霰弹枪,在他造成更多伤害之前找到无知的肇事者。
如果你幸运的话,你可以像这样制定你的过滤条件以命中索引:
where prodid - '|' - srcid - '|' - perid == '000038|001190|000001'
密钥可以作为单个参数传递给 OLEDB(因此在 C# 中进行连接并传递单个字符串)或者 - 如果涉及一些不方便的框架 - 作为三个单独的参数,然后在查询本身中连接:
where prodid - '|' - srcid - '|' - perid == ? - '|' - ? - '|' - ?
在不幸的情况下,您必须确定字段宽度并相应地填充:
where prodid + srcid + perid == '000038 001190 000001'
或使用如下表达式:
where prodid + srcid + perid == padr('000038', 8) + padr('001190', 12) + '000001'
¹) 'structural' CDX 文件意味着 CDX 被视为 DBF 的结构部分,在这种情况下,它的名称(除了扩展名)将与DBF 的偏移量 0x1C(十进制 28)处的标志字节的第 0 位 header 将被设置,指示结构 CDX 的存在。如果 CDX 仅具有相同的名称,但 DBF header 中的 CDX 位未设置,则 CDX 将不会被视为结构 CDX(即,它将 而不是 打开并自动维护)。