0

我正在尝试将 SQL Server 2008 数据库与专有的第三方数据库同步。在 SQL Server 数据库中,我希望同步的表中有一个时间戳/行版本类型的 SyncId 列。但第三方数据库不支持 rowversion 或 timestamp 列。它只支持一些基本类型,如字符串、数字、日期(仅存储日期,没有时间组件)、布尔值、十进制。

当我第一次同步时,我可能可以将 SyncId 作为字符串存储在第三方数据库中。稍后我将需要在此第三方数据库中检索最高可用的同步 ID。如何实现我的自定义比较逻辑/排序逻辑,以便获得最高的 Sync Id。

此外,在向 SQL Server 发送查询或存储过程参数时,如何将 SyncId 字符串值转换回本机 Sql Server 数据类型?

实现同步系统以将增量数据更改从 Sql Server 2008 下载到第三方数据库的任何其他想法?

编辑: 在从 SQL Server 数据库中检索 SyncId 并转换为字符串时,我遇到了一个异常。代码是:

            string sqlSyncId = "";
            SqlCommand selectNewAnchorCommand = new SqlCommand();
            string newAnchorVariable = "@sync_new_received_anchor";
            selectNewAnchorCommand.CommandText =
                "SELECT " + newAnchorVariable + " = min_active_rowversion() - 1";
            selectNewAnchorCommand.Parameters.Add(newAnchorVariable, SqlDbType.Timestamp);
            selectNewAnchorCommand.Parameters[newAnchorVariable].Direction = ParameterDirection.Output;
            selectNewAnchorCommand.Connection = conn;

            reader = cmd.ExecuteReader();

            if (reader.Read())
            {
                do
                {
                    sqlSyncId = reader["@sync_new_received_anchor"].ToString();
                } while (reader.Read());
            }



Stack Trace:    System.IndexOutOfRangeException: @sync_new_received_anchor
   at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
   at System.Data.SqlClient.SqlDataReader.get_Item(String name)

编辑: 我也试过:

sqlSyncId = reader["@sync_new_received_anchor"].ToString();     //same error
sqlSyncId = reader[0].ToString();   //Works

为什么我不能按名称引用列?

我收到的值是 101,但在数据库表中,SyncId 列具有不同的十六进制值。

4

0 回答 0