如何最大限度地减少OleDbDataAdapter从远程数据库获取数据的时间

本文关键字:数据库 获取 数据 时间 最大限度 OleDbDataAdapter | 更新日期: 2023-09-27 18:21:18

我的Windows窗体应用程序包含OleDbDataAdapter,从远程数据库获取数据需要更长的时间。它无法检索/保留类似5000行的表数据(应用程序被击中)。这是我的密码。

environments = ConfigurationManager.GetSection("Environment") as NameValueCollection;
string strConnString = environments[envs];
conn = new OleDbConnection(strConnString);
conn.Open();
OleDbDataAdapter objDa = new OleDbDataAdapter("select * from tblABC", conn);
DataSet ds1 = new DataSet();
objDa.Fill(ds1);
dataGridView1.DataSource = ds1.Tables[0];

环境部分在app.config文件中配置:

<configuration>
  <configSections>
    <section name ="Environment" type="System.Configuration.NameValueSectionHandler" />
  </configSections>
  <Environment>
    <add key ="CIT" value ="Password=pwd123;User ID=abc123;Data Source=db1;Persist Security Info=True;Provider=MSDAORA"/>
    <add key ="SIT" value ="Password=pwd234;User ID=abc234;Data Source=db2;Persist Security Info=True;Provider=MSDAORA"/>
    <add key ="UAT" value ="Password=pwd345;User ID=abc345;Data Source=db3;Persist Security Info=True;Provider=MSDAORA"/>
  </Environment>
</configuration>

如果有人能用代码提出更好的方法/机制,那就太好了。

如何最大限度地减少OleDbDataAdapter从远程数据库获取数据的时间

您尝试过使用线程吗。在程序中的某个地方创建一个子函数,如下面

public void dataPullingThread(){
    try{
        //your connection code goes here like below//
        environments = ConfigurationManager.GetSection("Environment") as NameValueCollection;
        string strConnString = environments[envs];
        conn = new OleDbConnection(strConnString);
        conn.Open();
        OleDbDataAdapter objDa = new OleDbDataAdapter("select * from tblABC", conn);
        DataSet ds1 = new DataSet();
        objDa.Fill(ds1);
        dataGridView1.DataSource = ds1.Tables[0];
        conn.Close();
    }
    catch (Exception e){
    }
}

//call your thread from desired location in program///
using System.Threading;
Thread thread = new Thread (new ThreadStart(dataPullingThread));
thread.start;
//Your application will continuously run; however, the data will appear when ever the thread auto kills itself. You can boost the speed if you create more then one thread. That means each thread selecting different rows of the database, I hope this information will help you//

以下是一些常见的ADO.NET优化技巧:

  • 请确保您确实需要所有字段,而不是执行SELECT *。问题是,可能会检索到许多未使用的字段值,从而消耗资源

例如,如果表包含的字段超过这三个,请执行SELECT Field1, Field2, Field3而不是SELECT *

  • 坚持以下连接打开/关闭模式:

示例:

using(var con = new OleDbConnection(strConnString))
{
    con.Open();
    ...
    con.Close();
}

因此,即使发生错误的事情,连接也会关闭,并且连接池机制将在服务器端使用。

  • DbDataReader对象的速度要快得多。请尝试使用DbDataReader而不是DbDataAdapter。使用它来填充通用列表,然后将DataGrid绑定到该列表

然而,您的连接本身似乎有问题。如何确保应用程序正在获取数据或试图建立连接?要检查这一点,请将查询更改为非常快速的查询,如"select sysdate from dual",以检查问题是否来自连接尝试。