0

バックグラウンド:

DataTableをSQLiteデータベースにコピーしようとしています。SQLServerデータベースで実行されている同等のデータセットと比較すると、SQLiteバージョンは約5倍の時間がかかります。これを合理化するために、バッチ処理を有効にするために使用しているSQLiteDataAdapterのUpdateBatchSizeプロパティを使用しようとしています。

問題:

ただし、値を設定しようとすると、System.NotSupportedExceptionが発生します。その値をどのように適切に設定しますか?コードを参照してください:

public int InsertDataTable(DataTable dt, string selectCommand)
{
    SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(selectCommand, m_conn);
    myAdapter.UpdateBatchSize = 0;
    int rowsAffected = myAdapter.Update(dt.Select());
    return rowsAffected;
}
4

2 に答える 2

1

UpdateBatchSize のポイントは、SQL ステートメントをネットワーク経由でデータベース サーバーに送信する前にグループ化することです。SQLite では、ネットワーク接続がないため、これを行う必要はありません。ファイルへの直接アクセスを使用しています。それがおそらくエラーが発生する理由です。おそらく、ドライバーはその設定で何もしないことを認識しているため、エラーになります。

SQL Server を使用している場合、その設定を 2 に増やすと、一度に 1 つずつ送信するのではなく、2 つの UPDATE ステートメントをグループ化して送信することを意味します。より大きな数に設定すると、サーバーへのラウンドトリップが少なくなります。そのため、SQL Server を使用している場合は、より大きな数値に設定して、ネットワーク遅延の影響を軽減します。0 に設定すると、バッチごとのステートメント数に制限がないことを意味しますが、バッチが非常に大きいことを意味する可能性があります。

明示的なトランザクションを作成することでパフォーマンスの問題が解決された理由は、トランザクション内で sqlite 操作を実行しない場合、SQL ステートメントごとに暗黙的に作成されるためです。おそらく、ファイルのロックとジャーナリング、および各ステートメントのさまざまなことを行う必要があります。したがって、SQLite を使用するときは常に明示的にトランザクションを作成する必要があります。これにより、トランザクションを作成しない場合よりも桁違いに改善されます。

于 2012-08-24T16:18:50.233 に答える
0

同じパフォーマンスの向上は、別の方法で達成できます。UpdateBatchSize を変更しようとする代わりに、更新を含む SQLiteTransaction を作成します。

public int InsertDataTable(DataTable dt, string selectCommand)
    {
        SQLiteDataAdapter adapter = new SQLiteDataAdapter(selectCommand, m_conn);
        SQLiteCommandBuilder builder = new SQLiteCommandBuilder(adapter);
        SQLiteTransaction transaction = m_conn.BeginTransaction();
        builder.GetInsertCommand().Transaction = transaction;
        int rowsAffected = adapter.Update(dt.Select());
        transaction.Commit();            
        return rowsAffected;
    }

ソース:

SQLiteトランザクション

于 2012-06-29T14:27:19.517 に答える