如何使用 .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(即,它将 而不是 打开并自动维护)。