1

我正在使用 oledbcommand 的对象从 dBase4 数据库中获取数据并将其加载到数据表中。但是在 5-10 分钟左右获取 160 条记录需要太多时间。请帮帮我。

代码:

 using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + TrendFilePath + "\\" + Pathname + ";" + @"Extended Properties=dBASE III;"))

 using (OleDbCommand cm = cn.CreateCommand())
 {
    cn.Open();

    for (int L = 0; L <= months; L++)
     {
         DataTable dt_Dbf = new DataTable();
         From_Date = DateTime.ParseExact(frmdate, dateFormat2, provider);
         From_Date = From_Date.AddMonths(L);

         int month = From_Date.Month;
         string year = "1" + From_Date.Year.ToString().Substring(2, 2);

         if (L == 0)
         {

              cm.CommandText = @"SELECT * FROM  128.DBF where DATE_Y =" 
                               + year + " and DATE_M = " + month + " and DATE_D>=" + From_Day + ""; 
              dt_Dbf.Load(cm.ExecuteReader(CommandBehavior.CloseConnection));
         }
    }
}
4

1 回答 1

0

我怀疑您正在执行的查询是问题所在。除非查询是对海量(数百万/十亿)数据集进行过滤,否则我认为它没有问题——即使您正在执行 12 个(我假设每个月?)这些查询。另外,在我写作的时候,您是否打算使用 DataTable?对于每个月,您填充表格,然后将其丢弃。(由于您提到数据库只有约 300k,因此查询本身不可能占用任何大量时间)。

它可能与网络或文件本身有关。正如我所说,您正在执行 12 个查询,但每个查询都成功后断开连接。这意味着您需要建立 12 个连接,同时运行 12 个查询。您应该调查是否可以为需要执行的一组查询维护单个连接。

另一种可能性是锁定。数据库文件是否能够维护多个连接并为不同的用户执行多个查询?我根本不了解 dbase 产品,但如果它是单用户/单线程的,则可能是其他人正在使用数据库并将您锁定一段时间。

尝试将数据库复制到本地计算机,更改连接字符串以引用本地副本,然后再次运行此代码。如果执行时间显着减少,我相信您将能够自信地说存在某种网络问题。从那时起,您将(可能)需要向您组织中的某个人寻求帮助。12 个看似简单的查询只需要 5-10 分钟就是个笑话。

如果网络是问题的原因,您可以采取多种选择。

  • 请网络/基础设施人员进行调查。它可能是共享上的磁盘,或者网络 IO 过载。
  • 在程序开始时将数据库复制到机器上。这仅在您只进行读取并且不需要更新数据时才有效。或者,在每个查询开始时复制到本地,并且只写入网络。这将保持(相对)新鲜的数据,并确保所有写入都是正确的。但是,如果您执行大量查询,则复制整个文件的网络成本可能会降低性能。
  • 使用更好的数据库产品(我的建议)。使用 Postgres 或 MySql(我建议 Postgres)设置数据库服务器,将 dbase 数据迁移到服务器,并让所有引用 dbase 文件的应用程序指向数据库服务器。如果多个连接需要访问数据库,您确实应该这样做。如果只有一个连接需要访问数据库,那么数据库应该在进行访问的机器上。
于 2011-03-05T11:39:45.307 回答