3

我的 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>

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

4

2 回答 2

3

您是否尝试使用线程。在程序的某处创建一个子函数,如下所示

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//
于 2014-09-20T15:54:53.697 回答
2

以下是一些通用的 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”,以检查问题是否来自连接尝试。

于 2014-09-15T07:29:08.757 回答