我有一个在2个数据库之间同步的应用程序:中央数据库托管在Sql Server 2008上,本地数据库是Sql Compact 3.5数据库。
我不时需要升级同步范围中包含的其中一个表的模式,我不想再取消配置和配置,所以我使用了this方法,对于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并检查列,我会看到以下内容:
中部:
.. | BusinessType | HideCommentAndSerialNumber | sync_update_peer_timestamp | sync_update_peer_key | sync_create_peer_timestamp | sync_create_peer_key |
本地:
.. | __sysTrackingContext | BusinessType | sync_update_peer_key | HideCommentAndSerialNumber | sync_update_peer_timestamp | sync_create_peer_key | sync_create_peer_timestamp |
我做错了什么?
答案 0 :(得分:0)
我发现了这个问题。范围是问题发生,它只将数据从中央数据库下载到本地数据库。
当我更新表架构时,我执行了以下操作: - 向两个数据库添加列 - 更新两个数据库上新列的值 - 更新两个数据库上的配置模式
问题是我执行了一个更新两个数据库上的列值的脚本。它只需要在中央数据库上执行,并且数据将在同步期间下载到客户端。
我改变了这一点,现在它起作用了;它以前也有类似的方案(添加/删除/更改已经在同步范围内的表的列类型)。