C# Trans-Pull订阅同步,同步后终止程序
我在本地SQL Server实例上有一个SQL数据库,我将数据复制到另一个数据库,该数据库也在本地SQL Server Express实例上 我使用以下代码执行同步操作:C# Trans-Pull订阅同步,同步后终止程序,c#,sql,replication,C#,Sql,Replication,我在本地SQL Server实例上有一个SQL数据库,我将数据复制到另一个数据库,该数据库也在本地SQL Server Express实例上 我使用以下代码执行同步操作: // Define server, publication, and database names. String subscriberName = Environment.MachineName + "\\SQLEXPRESS"; // String subscriberNam
// Define server, publication, and database names.
String subscriberName = Environment.MachineName + "\\SQLEXPRESS";
// String subscriberName = "(LocalDB)\v11.0";
String publisherName = ConfigurationManager.AppSettings["PublisherName"].ToString();
String publicationName = ConfigurationManager.AppSettings["PublicationName"].ToString();
String publicationDbName = ConfigurationManager.AppSettings["PublicationDbName"].ToString();
String subscriptionDbName = ConfigurationManager.AppSettings["SubscriptionDbName"].ToString();
// Create a connection to the Subscriber.
ServerConnection conn = new ServerConnection(subscriberName);
ServerConnection connPublish = new ServerConnection(publisherName, "sa", "mypassword");
TransPullSubscription subscription;
try
{
// Connect to the Subscriber.
conn.Connect();
// Define subscription properties.
subscription = new TransPullSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = subscriptionDbName;
subscription.PublisherName = publisherName;
subscription.PublicationDBName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.CreateSyncAgentByDefault = true;
// If the pull subscription and the job exists, start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
Microsoft.SqlServer.Replication.TransSynchronizationAgent agent = subscription.SynchronizationAgent;
agent.Synchronize();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
ReturnValue = false;
}
finally
{
conn.Disconnect();
}
`
现在我的问题是当代码代理.Synchronize()时;运行时,同步操作发生并成功完成,但程序终止。我多次检查数据库,每次都通过同步将新值发送到目标数据库。但之后,Visual Studio调试器将停止,好像什么也没发生一样,并只给我留下以下输出消息:
程序“[13880]MyProgramm.vshost.exe:程序跟踪”已退出,代码为0(0x0)。
程序“[13880]MyProgramm.vshost.exe”已退出,代码为-1073740777(0xc0000417)
没有错误,没有例外
你知道为什么会这样吗 我相信SQL Server管理API使用的是COM,而COM又是本机代码。当本机代码抛出异常时,它会先终止.Net运行时,然后才能处理任何异常。我在本机扩展中遇到过很多这样的问题,它们不能很好地处理错误。我所能建议的最好的事情是看看你是否可以通过一个存储过程来实现这一点,并调用该存储过程。你是否希望代理持续同步?我们终于找到了原因,尽管我觉得很奇怪。导致这种情况的原因实际上是Microsoft SQL Server 2012服务包3。我们在SQL 2012 SP1和SP2中尝试了相同的代码,效果非常好。然而,当我们更新到SP3时,这个问题开始发生。我们必须确保,甚至尝试在虚拟机上进行干净的安装,但这种情况再次发生。那么SP3为什么要这样做呢?我相信SQL Server管理API使用的是COM,而COM又是本机代码。当本机代码抛出异常时,它会先终止.Net运行时,然后才能处理任何异常。我在本机扩展中遇到过很多这样的问题,它们不能很好地处理错误。我所能建议的最好的事情是看看你是否可以通过一个存储过程来实现这一点,并调用该存储过程。你是否希望代理持续同步?我们终于找到了原因,尽管我觉得很奇怪。导致这种情况的原因实际上是Microsoft SQL Server 2012服务包3。我们在SQL 2012 SP1和SP2中尝试了相同的代码,效果非常好。然而,当我们更新到SP3时,这个问题开始发生。我们必须确保,甚至尝试在虚拟机上进行干净的安装,但这种情况再次发生。那么SP3为什么会这样做呢?