我正在尝试将 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 列具有不同的十六进制值。