0

ローカルの Users テーブルをリモートのテーブルで上書きすることになっている次のコードがあります。Merge が正常に動作していることがわかりますが、Update は何もしません (つまり、DataTable には新しい値がありますが、LocalDb 接続/データベースには書き込まれません)。これを機能させますか?

var RemoteUsersTable = DbRemote.ExecuteQuery("SELECT * FROM users");

if (RemoteUsersTable.Rows.Count > 0)
{
    SqlDataAdapter LocalDataAdapter = null;
    var LocalUsersTable = DbLocal.ExecuteQuery("SELECT * FROM users", ref LocalDataAdapter);

    LocalUsersTable.Merge(RemoteUsersTable);
    LocalUsersTable.AcceptChanges();

    LocalDataAdapter.Update(LocalUsersTable);
}
4

2 に答える 2

0

上記のコードの問題は、selectコマンドしか設定していないことです。テーブルを「更新」する場合は、「UPDATE」コマンドと「INSERT」コマンドの両方が必要になる可能性がありますLocaDataAdapter

DataAdapterのUpdateメソッドでは、データベーステーブルのレコードを変更/追加/削除する必要がある場合にこれらのコマンドが必要です。

通常、特定のコマンドを使用してDataAdapterをセットアップします。

コマンドビルダーを使用して、これを試すことができます:-

var RemoteUsersTable = DbRemote.ExecuteQuery("SELECT * FROM users");

if (RemoteUsersTable.Rows.Count > 0)
{
    SqlDataAdapter LocalDataAdapter = null;
    var LocalUsersTable = DbLocal.ExecuteQuery("SELECT * FROM users", ref LocalDataAdapter);

    LocalUsersTable.Merge(RemoteUsersTable);
    LocalUsersTable.AcceptChanges();

    cb.GetDeleteCommand(); // WHICH EVER YOUR COMMANDBUILDER IS CALLED.
    cb.GetInsertCommand();
    cb.GetUpdateCommand();

    LocalDataAdapter.Update(LocalUsersTable);
}
于 2012-12-03T11:11:45.357 に答える
0

AcceptChangesの呼び出しは、LocalUsersTableの変更された値が変更済みとしてマークされなくなったことを意味します。したがって、更新するものはありません。

いずれにせよ、これは大量更新を実行するための非常に醜く、遅く、危険な方法であり、決して使用されません。最も深刻な問題のほんの一部:

  • すべてのデータをいずれかのサーバーに送り返す前に、両方のサーバーからクライアントにすべてのデータをプルします。これにより、すべてのマシンの帯域幅と処理時間が無駄になるため、非常に低速になります。
  • 各テーブルからすべての列を取得します。これにより、スキーマが変更された場合に更新が失敗します。

DataTablesを使用する代わりに、トランザクション内でSQLステートメントを使用して必要な処理を実行する必要があります。

SQL Serverには、ソースクエリの行を使用してターゲットテーブルを更新し、個々の行の値を使用して何を実行するか(更新、挿入、削除)を決定できるMERGEステートメントがあります。または、古い行を削除して新しい行をトランザクション内に挿入する複数のステートメントスクリプトを作成することもできます

于 2012-12-03T11:15:13.027 に答える