4

コードにデータが設定された DataTable があります。

私は SQL Server CE 4.0 を使用しており、パフォーマンスの問題を回避するために以下を使用していSqlCeBulkCopyます。

SqlCeBulkCopyOptions options = new SqlCeBulkCopyOptions();
options = options |= SqlCeBulkCopyOptions.KeepNulls;

// Check for DB duplicates
using (SqlCeBulkCopy bc = new SqlCeBulkCopy(strConn, options))
{
    dt = RemoveDuplicateRows(dt, "Email");
    bc.DestinationTableName = "Recipients";
    bc.WriteToServer(dt);
}

RemoveDuplicateRowsDataTable から重複を削除しますが、データベースに既に存在するものに対するチェックはありません。

に渡す前に、実際のデータベース テーブルに存在する DataTable 内のすべてのアイテムを効率的に削除したいと考えていますWriteToServer(dt)

この問題に対する優れたパフォーマンスと費用対効果の高いソリューションは何でしょうか?

4

1 に答える 1

1

それで、データテーブルと既存のテーブルをマージする必要がありますか? SQL ce が一時テーブルをサポートしているかどうかはわかりません。ms sql と似たようなことをしました。これが疑似コードです。

string tmpTableDefinition = "create table #tmpEmails (...)";
using(var connection = new SqlCeConnection(connectionString))
{
    //Create temp table
    var tmpTableCommand = new SqlCeCommand(tmpTableDefiniton, connection);
    tmpTableCommand.ExecuteNonQuery();
    //Bulk copy to the temp table, note that bulk copy run faster if the teble is empty
    //which is always true in this case...
    using (var bc = new SqlCeBulkCopy(connection, options))
    {
         bc.DestinationTableName = "#tmpEmails";
         bc.WriteToServer(dt);
    }
    //Run a sp, that have temp table and original one, and marge as you wish in sql
    //for sp to compile properly, you would have to copy tmp table to script too
    var spCommand = new SqlCommand("sp_MargeTempEmailsWithOriginal", connection);
    spCommand.Type = SP //Don't remember exact prop name and enum value
    spCommand.ExecuteNonQuery();
}
于 2013-08-15T09:51:41.730 に答える