如何读取带有.CDX文件的dbf?

我正在用C#编写.NET应用程序。 该应用程序使用Visual FoxPro OLEDB提供程序读取FoxPro .DBF。

允许您读取.DBF文件的功能无法检测到.CDX文件并进行慢速查询。如何使用.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\Desktop\201901"

str_sql = Select * From 100307_fct where prodid = "000038" and srcid = "001190"  and perid = "000001" 

lhj730511 回答:如何读取带有.CDX文件的dbf?

VFP OLEDB提供程序会自动打开,使用和维护结构¹CDX文件,就像VFP IDE和运行时引擎一样。

有几件事会导致CDX不能用于加速查询:

  • 存在CDX但不存在结构
  • Rushmore已通过SET OPTIMIZE OFF禁用
  • 查询不包含与索引键匹配的可优化谓词

在这三个中,后者是迄今为止最常见的。有关Rushmore优化资格的规则可以在网上的其他地方找到,例如,在名为Understanding Rushmore的Fox Wiki文章中。本质是谓词中使用的表达式必须与可用的索引表达式匹配才能被优化。因此,除非您不知道索引中实际的索引表达式是什么,否则您就无法编写高效的查询。

在您的情况下,主索引很可能是包含多个字段的复合表达式,例如

prodid - '|' - srcid - '|' - perid

如果幸运的话,或者

prodid + srcid + perid

如果不是。如果您反而发现类似alltrim(prodid) + alltrim(srcid) + alltrim(perid)之类的东西,那么唯一有效的办法就是抓住your弹枪,然后在无知的肇事者再造成任何伤害之前先找到无知的肇事者。

如果幸运的话,您可以像这样制定过滤条件以达到指数:

where prodid - '|' - srcid - '|' - perid == '000038|001190|000001'

可以将键作为单个参数(因此在C#中进行串联并传递单个字符串)或(如果涉及到一些不方便的框架)作为三个单独的参数传递给OLEDB,然后在查询本身中对其进行串联:

where prodid - '|' - srcid - '|' - perid == ? - '|' - ? - '|' - ?

在不幸的情况下,您必须确定字段宽度并相应地填充:

where prodid + srcid + perid == '000038 001190 000001'

或使用如下表达式:

where prodid + srcid + perid == padr('000038',8) + padr('001190',12) + '000001'

¹)“结构” CDX文件意味着CDX被视为DBF的结构部分,在这种情况下,其名称(除扩展名外)将与DBF的名称相同,并且位0将设置DBF标头的偏移量0x1C(十进制28个)处的标志字节的“ 0”,指示存在结构CDX。如果CDX仅具有相同的名称,但未设置DBF标头中的CDX位,则该CDX将不被视为结构性CDX(即,将打开并自动维护)。

本文链接:https://www.f2er.com/3125954.html

大家都在问