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 つです。
何か案は ?