通过oledbcommand对象获取数据时,Executereader非常慢

时间:2011-03-02 11:49:28

标签: .net ado.net oledbcommand

我通过使用oledbcommand的对象从dBase4数据库获取数据并将其加载到datatable中。但是花费太多时间在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));
         }
    }
}

1 个答案:

答案 0 :(得分:0)

我怀疑你正在执行的查询是问题所在。除非查询是对大量(数百万/数十亿)数据集进行过滤,否则我不会发现它有问题 - 即使您正在执行这些查询的12(我假设每个月?)。另外,在我写作的时候,你是否计划使用DataTable?对于每个月,您填充表格,然后将其丢弃。 (既然你提到数据库只有~300k,那么查询本身就不可能占用任何重要的时间。)

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

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

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

如果网络是问题的原因,您可以选择几种方法。

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