1

複数のサーバーでホストされている単一テーブル データベースをサポートするデータ モデルがあります。ただし、従来の ASP ページに表示するために、複数のテーブルからデータをコンパイルする必要がある場合があります。これは、C++ の COM オブジェクトで行われます。OleDb を使用して SQL Server からデータを収集し、OleDb ロジックでデータを C++ 構造体に直接書き込みます。次に、データを SafeArrays に追加する構造体配列をループしてから、これらをレコードセットに追加します。レコードセットにデータを追加するロジックは、大まかに次のようになります (初期化とエラー処理ロジックは省略されています)。

SAFEARRAY* fields; // Initialised to integer array 0 -> max fields
SAFEARRAY* values;
VARIANT* arraydata;

... //  initialisation logic

SafeArrayAccessData(values, reinterpret_cast<void**>(&arrayData));

for(unsigned int i = 0; i < numDataValues1; ++i)
{
    // Add data
    arraydata[0].intVal = data[i].someValue;
    ... // etc.

    for(unsigned int j = 0; j < numDataValues2; ++j)
    {
        arraydata[21].intVal = data2[j].someValue;
        ... // etc.

        _recordset->raw_AddNew(fields, values);
        _recordset->Update();
    }
}

ただし、速度は比較的遅いです。1000 行のデータを追加するのに 1 秒かかることがありますが、これは私たちの環境では長すぎます。raw_AddNew と Update の呼び出しをコメントアウトすると、ロジックが飛びます。したがって、問題は、データをレコードセットに追加する方法にあります。提案やアドバイスをいただければ幸いです。よろしくお願いします。

4

1 に答える 1

1

ADO データベース接続をコーディングしてから長い時間が経ちましたが、私の記憶が正しければ、ロックを adLockBatchOptimistic に変更してからバッチ更新を実行する必要があります。その方がはるかに高速です。

これはあなたを助けるかもしれません

私の記憶が正しければ、それでもかなり遅かったです。

于 2012-11-24T04:12:33.823 に答える