2

1000 行ほどのデータテーブルがあります。行ごとにデータテーブルを調べ、列の値を取得し、クエリ (Access 2007 DB) を実行し、結果でデータテーブルを更新する必要があります。ここに私がこれまでに持っているものがあります。

String FilePath = "c:\\MyDB.accdb";

string QueryString = "SELECT MDDB.NDC, MDDB.NDC_DESC "
    + "FROM MDDB_MASTER AS MDDB WHERE MDDB.NDC = @NDC";

OleDbConnection strAccessConn = new OleDbConnection(string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FilePath));
strAccessConn.Open();
OleDbDataReader reader = null;

int rowcount = InputTable.Rows.Count; //InputTable is the datatable
int count = 0;

while (count < rowcount)
{
    string NDC = InputTable.Rows[count]["NDC"].ToString(); 
    //NDC is a column in InputTable                      

    OleDbCommand cmd = new OleDbCommand(QueryString, strAccessConn);
    cmd.Parameters.Add("@NDC", OleDbType.VarChar).Value = NDC;

    reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        //update the NDCDESC column with the query result
        //the query should only return 1 line
        dataSet1.Tables["InputTable"].Rows[count]["NDCDESC"] = reader.GetValue(1).ToString();
    }

    dataGridView1.Refresh();
    count++;
}
strAccessConn.Close();

ただし、クエリはデータテーブルの行ごとに 1 回実行する必要があるため、これは非常に非効率的です。より良い方法はありますか?

4

3 に答える 3

1

Excel からの InputTable に関する部分を見逃していました。

速度を上げるために、Access でクエリを何度も実行する代わりに、1 つの select ステートメントで MDDB_MASTER からすべての行をデータテーブルに取得できます。

SELECT MDDB.NDC, MDDB.NDC_DESC FROM MDDB_MASTER

次に、DataTable.Selectメソッドを使用して、右側の行をフィルター処理します。

mddb_master.Select("NDC = '" + NDC +'")

これはメモリ内で行われ、現在のすべての往復よりもはるかに高速になるはずです。特にネットワーク上では、これらの往復は高価です。225k 行は数 MB (ほぼ JPEG 画像) にすぎないため、問題にはなりません。

于 2013-07-03T20:45:06.560 に答える