-1

複数のMSAccessデータベーステーブルに接続しているときに現在のデータをフィルタリングするための次のc#コードがあります。これは正常に機能しますが、データセットdsが大きすぎてループができないため、別のmdbデータベーステーブルを呼び出す各行のチェックに戻るのに永遠に時間がかかります。これを最適化して、列フィルターに基づいて行を削除する方法はありますか?

string ABCACCESSDataSource = @"c:\websites\abc.mdb";
string XYZACCESSDataSource = @"c:\websites\xyz.mdb";

private void dataviewTable()
{
        OleDbConnection Conn = DatabaseCommands.openDBConnection(ABCACCESSDataSource, this);
        string query1 = select column1, column2, column3 from ABCTable where column2 = 'hello' order by column1;
        Dataview dv; 
        OleDbDataAdapter da = new OleDbDataAdapter(query1, Conn);

        DataSet ds = new System.Data.DataSet();
        da.Fill(ds, "ABCTable");

         foreach (DataRow dr in ds.Tables["ABCTable"].Rows)
          checkValue = dr["ABCTable"].ToString();
                        {
                        resultvalue = getvalue(checkValue);
                        if(resultvalue == "unavailable")
                        {
                            dr.delete();
                        }

             dv = ds.Tables["ABCTable"].DefaultView;    
}    

private string getvalue(string checkValuepassed)    
{
        OleDbConnection Conn2 = DatabaseCommands.openDBConnection(XYZACCESSDataSource, this);
        string query2 = select columnX from XYZTable where columnY = 'test' AND columnZ = '" + checkValuepassed +"'" ;;

        OleDbDataAdapter da2 = new OleDbDataAdapter(query2, Conn2);
        ds2 = new DataSet();
                        da2.Fill(ds2);
                        resultVal = ds2.Tables[0].Rows[0][0].ToString() ;

                        return resultVal;
}
4

2 に答える 2

0

2 番目のデータベース (XYZ) の大きさは? メモリに収まる場合は、最初に Dictionairy で (columnZ = ... なしで) すべての行を選択し、次に getvalue(..) でメモリ操作のみを実行して、多くの OleDb クエリを節約できます。

于 2012-09-26T20:38:43.163 に答える
0

単一の値を取得している場合、それをテーブルに入れて値を取得するのは遅くなります。

ただし、値は一度取得してください。

string query2 = select columnZ, columnX from XYZTable where columnY = 'test' ;;

Dictionary<string, string> table2Dict = new Dictionary<string, string>();

table2Dict.add(columnZ, columnX);

colZvalue = table2Dict[checkValuepassed];

これを見る別の方法は、ABC をループしないことです。
XYZ をループして、ABC に削除コマンドを発行するだけです。
レコードがそこにない場合、何も削除されません。そして、10~100 人程度のグループにまとめます。
スイートスポットがあります。
(..,..,..) の [ABCTable] の [XYX] を削除します。

于 2012-09-26T20:48:01.607 に答える