Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加载大型Visual FoxPro文件非常慢。C(OleDB)_C#_Visual Foxpro - Fatal编程技术网

C# 加载大型Visual FoxPro文件非常慢。C(OleDB)

C# 加载大型Visual FoxPro文件非常慢。C(OleDB),c#,visual-foxpro,C#,Visual Foxpro,我想将大型.DBF Visual FoxPro文件加载到数据表中。 对于小于300MB的较小文件,它可以与fill命令配合使用,并且运行速度非常快。 但对于较大的文件,我的内存不足,需要将它们加载到较小的部分。 加载第0…1000行,然后加载第1001…2000行,依此类推 根据在internet上找到的一些代码,我进行了此操作,input start是开始读取的行,max是我要读取的行数 问题是,即使我只想读取5行,由于命令.ExecuteReader的执行速度非常慢,在我的机器上也需要大约3

我想将大型.DBF Visual FoxPro文件加载到数据表中。 对于小于300MB的较小文件,它可以与fill命令配合使用,并且运行速度非常快。 但对于较大的文件,我的内存不足,需要将它们加载到较小的部分。 加载第0…1000行,然后加载第1001…2000行,依此类推

根据在internet上找到的一些代码,我进行了此操作,input start是开始读取的行,max是我要读取的行数

问题是,即使我只想读取5行,由于命令.ExecuteReader的执行速度非常慢,在我的机器上也需要大约30-60秒

  public DataTable LoadTable2(string folder, string table, int start, int max)
  {
        string ConnectionString = "Provider=vfpoledb.1;Data Source="+folder+"\\"+table;
        OleDbConnection Connection = new OleDbConnection(ConnectionString);
        Connection.Open();
        string dataString = String.Format("Select * from {0}", table);
        OleDbCommand Command = new OleDbCommand(dataString, Connection);
        //Takes very long time on large files.
        OleDbDataReader Reader = Command.ExecuteReader(CommandBehavior.SequentialAccess);
        DataSet ds = new DataSet();
        var dt = ds.Tables.Add(table);
        // Add the table columns. 
        for (int i = 0; i < Reader.FieldCount; i++)
        {
           dt.Columns.Add(Reader.GetName(i), Reader.GetFieldType(i));
        }
        int intIdx = 0;
        int cnt = 0;
        while (Reader.Read())
        {
           if (intIdx >= start)
           {
              DataRow r = dt.NewRow();
              // Assign DataReader values to DataRow.  
              for (int i = 0; i < Reader.FieldCount; i++)
                 r[i] = Reader[i];
              dt.Rows.Add(r);
              cnt++;
           }
           if (cnt >= max)
           {
              break;
           }
           intIdx++;
        }
        Reader.Close();
        Connection.Close();
        return dt;
  }
我已经用OLE和ODBC连接进行了测试,没有大的区别。 文件都在本地光盘上

有没有人有一个好主意,如何使这更快

致意
Anders

我相信,使用该驱动程序VFPOLEDB,您可以更改查询以指定感兴趣的记录编号。这样,就不需要通过阅读一堆记录来到达起点。这样就没有必要跳过任何记录;只需读取整个请求的结果集。查询可能如下所示:

SELECT * from thetable where recno() >= 5000 and recno() <= 5500

我意识到我已经安装了这个驱动程序,并且刚刚测试了它,它确实工作了。然而,我不认为它优化了该语句。理论上,它可以使用记录编号直接计算记录偏移量,但基于对更大dbf上的查询的简单观察,它似乎要进行全表扫描。然而,使用FoxPro,您可以在recno上创建索引,然后对其进行优化

这就是我们使用分页的原因。正如马克在回答某个关键问题时提到的。。。您要查询的表是否有一些可以基于的自动增量ID?如果这有一个索引,那也会有帮助。嗨,Mark thnaks,这句话是针对结果的,但不是速度。FoxPro文件是由一个我无法修改的程序生成的。注意:如果你不能使用索引字段或创建索引,那么看起来你可能运气不好。也许可以使用execscript函数并执行某种本机VFP命令来检索数据。我不确定。作为跟进:我们开发了一个小的foxpro程序,它可以将.dbf转换成.csv文件,然后更快地上传到sqldb中。