1

私は約60,000レコードの中規模のデータベースを使用しています。私は.sdf、デバイスで表示および変更するために単一のテーブルをコンパクトにチェックアウトし、ユーザーが変更をメインサーバーに同期して新しい情報を受信できるようにするモバイルアプリケーションの構築に取り組んでいます。

WCFサービスライブラリを使用して同期フレームワークでセットアップしました。何らかの理由で接続を設定すると、データベースで[SQL Server変更の追跡を使用する]をオンにできず、エラーが発生します。

"'テーブル'Inventory'のスキーマをDbServerSyncProviderのGetSchema()メソッドで取得できなかったため、クライアントデータベースを初期化できません。クライアントデータベースへの接続を確立できることと、SelectIncrementalInsertsCommandのいずれかを確認してください。プロパティまたはSyncAdapterのSelectIncrementalUpdatesCommandプロパティが正しく指定されています。」

そのため、チェックを外して、作成済みの列「AddDateTime」と「LastEditTime」を使用するように設定しました。問題なく機能しているようです。大量の調整を行った後、部分的に機能しています。デバイスの変更はデータベースと完全に同期し、更新、削除、すべてが適用されます。ただし、サーバー側での変更は...更新されることはありません。問題が発生しないように、すべてが双方向セットアップで正しくセットアップされていることを確認しました。そして、私はそれを一晩置いて、データベースが最大500の新しいレコードを受信したようにしました。今朝、データベースに最新の24のエントリを同期しました...500の新しいレコードのうち。したがって、サーバーから情報を受信できることをさらに証明する必要がありますが、すべての有用な目的のために、そうではありません。

私はほとんどすべてを試しました、そして私は正直にそれを失うことに近づいています。誰かが捨てることができるアイデアを持っているなら、私は私が最も感謝することを追いかけることができます。

戻って、「SQLServerの変更の追跡」でそれができない理由を理解する必要があるかどうかはわかりません。または、サーバー上の変更の99%が実際にクライアントに同期されない理由について簡単な説明がある場合。

また、他の多くのサービスが使用しているため、サーバーデータベーステーブルスキーマを変更することはできません。ただし、コンパクトなデータベースは、テーブルを格納して両方向に適切に同期するために必要なものであれば何でもかまいません。

ありがとうございました!!

クイック概要:

  • WCFの使用とSQLServer変更追跡なしの同期(サーバーとデータベースで完全に有効化)
  • クライアントからサーバーへの変更の同期は完全に機能します
  • サーバーからクライアントへの同期はそれほど多くありません。一晩で500の新しいエントリのうち、同期で24をダウンロードしました。

編集:JuneTは私に時間とそのアンカーについて考えさせました。今朝同期したとき、約300の新しい追加レコードのうち54がプルされました。私はその行に入りました(約60の列があるので、読みやすくするためにそれらを削除しました。これは一種の冗談です)

this.SelectIncrementalUpdatesCommand.CommandText = @ "SELECT [Value]、[Value]、[Value] FROM> TABLE WHERE([LastEditDate]> @sync_last_received_anchor AND [LastEditDate] <=> @sync_new_received_anchor AND [AddDateTime] <= @sync_last_received_anchor)" ;

そして、@sync_last_received_anchorを2つの異なる時間に置き換えました。同期すると、これら2つの間にトラップされた行が返され、真ん中の行が削除されて次のようになります。

this.SelectIncrementalUpdatesCommand.CommandText = @ "SELECT [Value]、[Value]、[Value] FROM> TABLE WHERE([LastEditDate]> '2012-06-13 01:03:07.470' AND [AddDateTime] <= '2012- 06-14> 08:54:27.727') "; (注:2番目の日付は現在の時刻です)

当初の計画よりも数百行多く返されましたが(日付のギャップを600に設定しましたが、800をわずかに超えて返されました)。実際には、クライアントを新しいサーバーの変更と同期します。

@sync_last_received_anchorを使用できない理由と、何を探すべきかを誰かが説明できますか。ユーザーが更新を開始する日付を選択できるボックスをいつでも追加できると思いますか?または、同期が正常に完了したときに更新される同期日を保存するために、ある種のxmlファイルを追加しますか?

ありがとう!

編集:SQLプロファイラーを実行しました...日付(@sync_last_received_anchor)は、実際の時刻より8時間早く設定されています。それがどのように、またはなぜこれを行っているのか私にはわかりませんが、それは間違いなく理にかなっています。

4

2 に答える 2

0

アンカーは次のように収集されます。

this.SelectNewAnchorCommand.CommandText = "Select @sync_new_received_anchor = GETUTCDATE()";

そのUTC日付が、8時間のギャップを引き起こしていたものです。これを修正するには、GETDATE()に変更するか、コマンドのWHERE句で列をUTC時間に変換します。

于 2012-06-15T18:20:40.433 に答える
0

たくさんのコーヒーを飲みながら何時間も過ごした後、私はこの私の誤りを解決する方法を見つけました。デスクトップテストエリアでコードを実行している間、すべてが完全に機能しているように見えました。ただし、ターゲットデバイス上の同じコードとWebサービスで、このエラーが繰り返し発生しました。その後、突然、コンパクトデータベーステーブル名の「dbo_」プレフィックスが、本当に重要なことを教えてくれたように、面白く見え始めました。だから、私は聞いた...

Configuration.SyncTables.Add("Products);

ClientSyncAgent.csのを次のように変更する必要があります

Configuration.SyncTables.Add("dbo_Products");

[Exeunt]

于 2017-01-26T11:40:14.987 に答える