Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何同步2个数据库_C#_Sql_Sql Server 2008_Synchronization - Fatal编程技术网

C# 如何同步2个数据库

C# 如何同步2个数据库,c#,sql,sql-server-2008,synchronization,C#,Sql,Sql Server 2008,Synchronization,我想同步2条特定于数据库的记录。 假设我有两个数据库 1.Shop 2.Stock 现在让我们假设用户更改库存中特定产品的价格。我想改变这个产品的价格在商店也 我得出的结论是,假设互联网连接稳定 当股票价格发生变化时,我调用一个web服务,该服务将在web数据表price中插入条目 现在在商店方面,我每20分钟使用web服务ping一次web数据表,如果我发现任何新条目,我会更新商店中的相关产品价格 我考虑的另一个选择是复制。但我们使用的是SQL Server的express editi

我想同步2条特定于数据库的记录。 假设我有两个数据库

1.Shop 
2.Stock
现在让我们假设用户更改库存中特定产品的价格。我想改变这个产品的价格在商店也

我得出的结论是,假设互联网连接稳定

  • 当股票价格发生变化时,我调用一个web服务,该服务将在web数据表price中插入条目
  • 现在在商店方面,我每20分钟使用web服务ping一次web数据表,如果我发现任何新条目,我会更新商店中的相关产品价格
我考虑的另一个选择是复制。但我们使用的是SQL Server的express edition,据我所知,express edition不能作为发布者使用


是我的第一个选择对于这个目的来说是有效的,还是我遗漏了什么,并且有更好的选择来实现这个目的

您可以在Stock表上创建触发器

CREATE TRIGGER triggerName
ON [Stock].[dbo].[products]
AFTER UPDATE 
AS 
IF ( UPDATE (productPrice))
BEGIN
    --insert to shop
END
GO

您可以在Stock表上创建触发器

CREATE TRIGGER triggerName
ON [Stock].[dbo].[products]
AFTER UPDATE 
AS 
IF ( UPDATE (productPrice))
BEGIN
    --insert to shop
END
GO

您可以像上面pRime所说的那样在表上有一个触发器,但不要直接写入另一个数据库,而是将更改写入本地“暂存”表,然后每隔20分钟左右安排一个任务将更新发送到第二个数据库

您可以将第二个DB设置为链接服务器


这样可以避免在两个dbs之间的连接断开时将表设置为只读触发器。

您可以像上面pRime所说的那样在表上设置触发器,但不必直接写入另一个数据库,而是将更改写入本地“暂存”表,然后每隔20分钟左右安排一个任务将更新发送到第二个数据库

您可以将第二个DB设置为链接服务器


通过这种方式,您可以避免在两个dbs之间的连接断开时,将表设置为只读触发器。

如果无法在这种情况下使用MS SQL Server复制功能(需要一些您已经确定的非快速版)(请参阅),则另一种选择是使用MS Sync Framework(可以使用DBs、SQL CE等文件,甚至自定义数据源等)-请参阅

如果您真的希望自己在代码中实现这一点(我强烈建议您不要这样做),那么将其实现为“推送场景”:

  • 填充暂存表的DB触发器
  • Windows服务,它检查临时表中的更改并应用这些更改n
  • 冲突解决规则
  • 完成所有记录,以便能够分析差异(以防万一)

如果无法在这种情况下使用MS SQL Server复制功能(需要一些您已经确定的非快速版)(请参阅),那么另一个选项是使用MS Sync Framework(可以与DBs一起使用,一直到SQL CE等,甚至可以与文件、自定义数据源等一起使用)-请参阅

如果您真的希望自己在代码中实现这一点(我强烈建议您不要这样做),那么将其实现为“推送场景”:

  • 填充暂存表的DB触发器
  • Windows服务,它检查临时表中的更改并应用这些更改n
  • 冲突解决规则
  • 完成所有记录,以便能够分析差异(以防万一)

只是出于好奇-如果两个数据库位于不同的服务器上和/或防火墙后面,这也会起作用吗?我不确定防火墙,但对于不同的服务器(服务器必须链接在一起)您可以将表显式引用为servername.databasename.tablename..但这可能会有一些性能问题…而不是使用复制…我通常建议不要跨数据库触发器,更不要说跨服务器-如果网络连接中断,您会有效地将此表设为只读,并避免它产生错误会很有趣的。@Damien你有什么建议吗?我真的很感兴趣this@Uw-我强烈建议从Express edition升级到支持复制和/或service broker的版本,然后使用这两个版本中的任何一个。哪一个版本将取决于更新频率、延迟要求等。尝试自己构建一个健壮的如果两个数据库位于不同的服务器上和/或防火墙后面,这也会起作用吗?我不确定防火墙,但针对不同的服务器(服务器必须链接在一起)您可以将表显式引用为servername.databasename.tablename..但这可能会有一些性能问题…而不是使用复制…我通常建议不要跨数据库触发器,更不要说跨服务器-如果网络连接中断,您会有效地将此表设为只读,并避免它产生错误会很有趣的。@Damien你有什么建议吗?我真的很感兴趣this@Uw-我强烈建议从Express edition升级到支持复制和/或service broker的版本,然后使用这两个版本中的任何一个。哪一个版本将取决于更新频率、延迟要求等。尝试自己构建一个健壮的与经过测试和测试的组件相比,要在防火墙等环境中正常工作,并应对网络中断等情况,通常需要付出太多的努力。复制或service broker显然是这项工作的工具,但正如您已经确定的,它们至少需要一个SQL Server的非快速版本才能工作。这可能是一个用于dba.SE的版本,但是,如果OP的SQL版本无法进行复制,则可能需要一个非数据库编码的解决方案。因此,我暂时离开这里。复制或service broker是这项工作的明显工具,但正如您已经确定的,它们至少需要一个SQL Server的非express版本才能工作。这可能是一个用于dba.SE的版本,但可能有必须是非数据库编码的sol