【发布时间】:2018-02-13 07:01:40
【问题描述】:
我们创建了一个 Windows 窗体应用程序来使用合并发布和合并拉订阅同步数据库。我们已成功创建发布和订阅。现在我们要开始同步数据了。
为此,我们要执行下面的 SQL 命令:
-- Declare the variables.
DECLARE @publicationDB AS sysname;
DECLARE @Subscriber AS sysname;
DECLARE @Publisher AS sysname;
DECLARE @SubscriptionDB AS sysname;
DECLARE @Publication AS sysname;
DECLARE @sql VARCHAR(8000);
DECLARE @sqlDist VARCHAR(8000);
SET @Publisher = 'MSSQLSERVER2014';
SET @Subscriber = 'SQLEXPRESS2014';
SET @PublicationDB = 'ServerDB' ;
SET @SubscriptionDB = 'ClinetDB';
SET @Publication = 'ServerDB_PUBLICATION';
--Start the Merge Agent with concurrent upload and download processes.
SET @sql = '"C:\Program Files\Microsoft SQL Server\130\COM\REPLMERG.EXE" -Publication ' + @Publication+ ' -Publisher ' + @Publisher + ' -Subscriber ' + @Subscriber + ' -Distributor ' + @Publisher + ' -PublisherDB ' + @PublicationDB + ' -SubscriberDB ' + @SubscriptionDB + ' -PublisherSecurityMode 0 -PublisherLogin sa -PublisherPassword Abc@1234 -OutputVerboseLevel 2 -SubscriberSecurityMode 1 -SubscriptionType 1 -DistributorSecurityMode 0 -DistributorLogin sa -DistributorPassword Abc@1234 -Validate 3 -ParallelUploadDownload 1'
EXEC master..xp_cmdshell @sql
如何在 C# 中执行上述命令?我们不会使用 cmd 或 powershell。
我们在下面尝试过,但在@publication 出现语法错误:
string SP_xp_cmdshell = "'C:\\Program Files\\Microsoft SQL Server\\130\\COM\\REPLMERG.EXE' -Publication " + mPublication + " -Publisher " + mPublisher + " -Subscriber " + mSubscriber + " -Distributor " + mPublisher + " -PublisherDB " + mPublicationDatabase + " -SubscriberDB " + mSubscriptionDatabase + " -PublisherSecurityMode 0 -PublisherLogin " + mLogin + " -PublisherPassword " + mPassword + " -OutputVerboseLevel 2 -SubscriberSecurityMode 1 -SubscriptionType 1 -DistributorSecurityMode 0 -DistributorLogin " + mLogin + " -DistributorPassword " + mPassword + " -Validate 3 -ParallelUploadDownload 1";
cmd.Connection = mConnection; //master connection
cmd.CommandText = "xp_cmdshell "+ SP_xp_cmdshell;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
【问题讨论】:
-
最后
xp_cmdshell也会运行CMD.EXE来调用你传递的命令。 “唯一”的区别是,xp_cmdshell将在数据库服务器本身上执行,这与您的应用程序运行所在的机器不能是同一台机器 - 如果您有单独的一台,这当然会有所不同。此外,出于安全原因,xp_cmdshell在生产环境中经常被禁用。此外,如果您简单地使用字符串连接,您将引入 SQL 注入攻击向量。 -
@Christian.K :感谢您的快速回复。那么,使用合并复制同步数据库有什么更好的方法或替代方法?
-
关于数据库的一般问题,您最好联系dba.stackexchange.com。
标签: c# database-replication data-synchronization merge-replication xp-cmdshell