0

我有一个在 2 个数据库之间同步的应用程序:中央数据库托管在 Sql Server 2008 上,本地数据库是 Sql Compact 3.5 数据库。

有时我需要升级同步范围中包含的一个表的架构,我不想再次取消配置和配置,所以我使用了这种方法,对于 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 并检查列,我会看到以下内容:

中央:

..| 业务类型 | 隐藏评论和序列号 | sync_update_peer_timestamp | sync_update_peer_key | sync_create_peer_timestamp | sync_create_peer_key |

当地的:

..| __sysTrackingContext | 业务类型 | sync_update_peer_key | 隐藏评论和序列号 | sync_update_peer_timestamp | sync_create_peer_key | sync_create_peer_timestamp |

我究竟做错了什么?

4

1 回答 1

0

我发现了问题。发生问题的范围是,它仅将数据从中央数据库下载到本地数据库。

当我更新表架构时,我执行了以下操作: - 将列添加到两个数据库 - 更新两个数据库上新列的值 - 更新两个数据库上的配置架构

问题是我执行了一个脚本来更新两个数据库上的列值。它只需要在中央数据库上执行,同步时数据会下载到客户端。

我已经改变了它,现在它可以工作了;并且它以前也适用于类似的场景(添加/删除/更改已经在同步范围内的表的列类型)。

于 2012-11-21T14:39:58.410 回答