0

SQL Server とローカルの SQL Server コンパクト データベースの間でデータを移動しています。標準の DataAdapter.Fill などを使用して、データセットに単一のテーブルを設定しています。次に、そのデータセットを別の関数に渡し、ローカルの SQL Compact DB を更新しようとします。

したがって、基本的には、DB (SQL Server) から単一のデータテーブル (今のところ) を持つデータセットを抽出し、それを別の DB (SQL Compact) にスローしたいと考えています。

(はい、これを行うためのツールがあり、フレームワークを同期することは知っていますが、このアプローチには他の理由があります)

変更を検出するために、(私自身のローリングの) データ バージョンと ID を使用しています。したがって、ID がそれよりも大きい場合は、その行を追加済みとしてマークし、それ以外の場合は、行のデータバージョンがそれよりも高い場合は、その行を変更済みとしてマークします。

if (Convert.ToInt32(row["SettingID"]) > id)
{
   row.AcceptChanges();
   row.SetAdded();
}
else if(Convert.ToInt32(row["DataVersion"]) > dv)
{
    row.AcceptChanges();
    row.SetModified();

}

削除の処理は少し異なりますが、ここでは重要ではありません。

次に、SqlCeAdapter を作成して、レコードを CE データベースに挿入/更新します。

using (SqlCeDataAdapter ad = new SqlCeDataAdapter("select * from " + tableName, Connection))
{
    using (SqlCeCommandBuilder cb = new SqlCeCommandBuilder(ad))
    {
        cb.ConflictOption = ConflictOption.OverwriteChanges;
        ad.UpdateCommand = (SqlCeCommand)cb.GetUpdateCommand();
        ad.InsertCommand = (SqlCeCommand)cb.GetInsertCommand();

        ad.FillSchema(ds, SchemaType.Source); //Tried both types and not doing this.

        ad.RowUpdating += ad_RowUpdating;
        ad.RowUpdated += ad_RowUpdated;

        int result = ad.Update(ds, tableName);
    }
}

挿入の場合、これは正常に機能します-それらはすべて通過します。

更新が機能しません。

渡されたデータ テーブルの行を確認すると (つまり、上記の using ステートメントの直後)、ステータスが変更されていますが、これは正しいです。Update メソッドは、更新する正しい数の行を返しますが、それらは変更されていません (嘘です!)。例外はありません。

RowUpdating および RowUpdated イベントをサブスクライブすると、RowUpdating メソッドが行ごとに起動します。SqlCeRowUpdatedEventArgs を見ると、各行のステータスは SkipCurrentRow で、コマンド オブジェクトは null です。RowUpdated イベントは発生しません。

Modified のステータスが失われ、SkipCurrentRow が使用されているのはなぜですか?

これを変更して宛先データセットを作成し、ソースからの行で更新すると、両方のイベントが発生し、更新が行われます。繰り返しますが、違いが何であるかはわかりません。データセットとデータテーブルの両方のプロパティを比較してみましたが、同じように見えます。

これは単純であるべきだと思いますが、額 -> 机のインターフェイスの状況の 1 つです。

何か案は ?

4

0 に答える 0