3

Windows フォーム アプリケーションに OleDbDataAdapter が含まれているため、リモート DB からデータを取得するのに時間がかかります。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 *すべてのフィールドが本当に必要であることを確認してください。問題は、多くの未使用のフィールド値が取得される可能性があり、リソースを消費することです。

たとえば、テーブルにこれら 3 つ以上のフィールドが含まれている場合は、SELECT Field1, Field2, Field3代わりに実行します。SELECT *

  • 次の接続の開閉パターンに固執します。

例:

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

    ...

    con.Close();
}

そのため、問題が発生しても接続は閉じられ、サーバー側で接続プールメカニズムが使用されます。

  • DbDataReaderオブジェクトははるかに高速ですDbDataAdapter の代わりに DbDataReader を使用してみてください。それを使用して一般的なリストを埋めてから、DataGrid をそのリストにバインドします。

ただし、接続自体に問題があるようです。アプリケーションがデータをフェッチしているか、接続を確立しようとしていることをどのように確認できますか? これを確認するには、クエリを「select sysdate from dual」などの非常に高速なクエリに変更して、問題が接続試行に起因するものかどうかを確認します。

于 2014-09-15T07:29:08.757 に答える