0

2 つのデータベース間で同期するアプリケーションがあります。中央のデータベースは Sql Server 2008 でホストされ、ローカルのデータベースは Sql Compact 3.5 データベースです。

時々、同期スコープに含まれるテーブルの 1 つのスキーマをアップグレードする必要があり、プロビジョニングを解除して再度プロビジョニングしたくないので、このアプローチを使用しました。Sql Compact の場合、次のようなものがあります。

public void UpdateProvisionSchema(string connString, string scopeName, string newConfigData)
{
    _log.Verbose("UpdateProvisionSchema: " + scopeName);

    try
    {
        string query = string.Format("SELECT [scope_config_id] FROM [scope_info] WHERE [sync_scope_name]='{0}'", scopeName);
        Guid config_id = (Guid)SqlCompactManager.ExecuteScalar(connString, query);

        string updateCommand = string.Format("UPDATE scope_config SET [config_data]='{0}' WHERE [config_id] ='{1}'", newConfigData, config_id);
        SqlCompactManager.ExecuteCommand(connString, updateCommand);
    }
    catch (Exception ex)
    {
        _log.Error(ex, string.Format("Failed to upgrade schema for scope {0}", scopeName));
        throw new Exception(string.Format("Update of provisioned schema failed for scope: {0}", scopeName));
    }
}

テーブルの構成スコープを手動で変更します。空のテーブルをプロビジョニングして生成したため、送信したスコープ構成は正しいものだと思います。

同期スコープに含まれるテーブルに列を追加したところ (そのデータは中央データベースからローカル データベースにのみダウンロードされます)、ApplyChangeFailed でエラーが発生しました。

Sql Compact データベースでは、問題のある同期スコープに含まれるテーブルに、中央のテーブルに存在しない __sysTrackingContext という列があるようです。

初めてテーブルを作成してプロビジョニングし、次に 2 つの新しい列 (BusinessType、HideCommentAndSerialNumber) を追加しました。DbApplyChangeFailedEventArgs を見て列を調べると、次のように表示されます。

中央:

..| 業種 | HideCommentAndSerialNumber | sync_update_peer_timestamp | sync_update_peer_key | sync_create_peer_timestamp | sync_create_peer_key |

ローカル:

..| __sysTrackingContext | 業種 | sync_update_peer_key | HideCommentAndSerialNumber | sync_update_peer_timestamp | sync_create_peer_key | sync_create_peer_timestamp |

私は何を間違っていますか?

4

1 に答える 1

0

問題が見つかりました。問題が発生する範囲は、中央データベースからローカル データベースにデータをダウンロードするだけです。

テーブル スキーマを更新したとき、次のことを行いました。 - 両方のデータベースに列を追加 - 両方のデータベースで新しい列の値を更新 - 両方のデータベースでプロビジョニング スキーマを更新

問題は、両方のデータベースで列の値を更新するスクリプトを実行したことです。中央データベースでのみ実行する必要があり、データは同期中にクライアントにダウンロードされます。

これを変更したところ、動作するようになりました。また、以前は同様のシナリオ (既に同期されているスコープにあるテーブルの列の種類を追加/削除/変更) でも機能していました。

于 2012-11-21T14:39:58.410 に答える