C# Azure-SqlBulkCopy引发超时过期异常

C# Azure-SqlBulkCopy引发超时过期异常,c#,sql-server,azure,sqlbulkcopy,sqlcommand,C#,Sql Server,Azure,Sqlbulkcopy,Sqlcommand,我正在虚拟机上使用azure sql数据库(v12)。我有两个不同的数据库实例——一个用于暂存,另一个用于生产。我试图通过点击一个按钮,从暂存中获取数据并将其插入到生产中。此代码“有时”会成功运行,这意味着它会成功。否则,我将返回一个错误: 批量复制提交异常类型:{0}System.Data.SqlClient.SqlException批量复制消息:{0}超时已过期。操作完成前已过超时时间,或者服务器没有响应。尝试连接到路由目标时发生此故障。尝试连接到原始服务器的持续时间为-[预登录]初始化=1

我正在虚拟机上使用azure sql数据库(v12)。我有两个不同的数据库实例——一个用于暂存,另一个用于生产。我试图通过点击一个按钮,从暂存中获取数据并将其插入到生产中。此代码“有时”会成功运行,这意味着它会成功。否则,我将返回一个错误:

批量复制提交异常类型:{0}System.Data.SqlClient.SqlException批量复制消息:{0}超时已过期。操作完成前已过超时时间,或者服务器没有响应。尝试连接到路由目标时发生此故障。尝试连接到原始服务器的持续时间为-[预登录]初始化=1;握手=17;[登录]初始化=0;认证=0;[登录后]完成=0

这是我用来完成这项任务的代码,可能有一个我没有看到的缺陷。通过转储StringBuilder,我可以看到SELECT查询工作,DELETE查询工作,但当我尝试使用SqlBulkCopy复制数据时,会抛出错误。任何帮助都将不胜感激。我已经阅读了一大堆MSDN文档,但运气不佳->添加了更长的CommandTimeout,添加了更长的BulkCopyTimeout,并在防火墙上重新配置了端口。还是不走运

我使用的资源:


创建SqlBulkCopy实例时,您传递的是连接字符串
externalConnectionString
,从而打开一个新连接。这可能会导致两个连接都试图修改同一个表时出现死锁问题


您是否已尝试将现有连接
externalConnection
传递给SqlBulkCopy构造函数而不是连接字符串?

两台服务器是否位于同一虚拟网络上?您是否尝试过超时,或者增加批量大小,以减少往返次数?我有一个类似的过程,尽管我使用简洁、反应式扩展和简单的数据来完成同样的事情。在我的例子中,我只需要在设置上下功夫,直到找到最好的结果。此外,我有重试逻辑,这很有帮助,但没有银弹IMHO。是的,两个数据库都在同一个azure服务器上。我试着将我的超时时间增加到30分钟,但这只会让它们暂停30分钟。。。我现在正在复制的表只有400行,因此更改批处理大小对我没有影响。该进程是否在同一虚拟网络上运行代码?好主意,我将尝试一下。你说得对,当我实例化SqlBulkCopy时,由于我以前对同一表的删除查询,我锁定了该表。我所要做的就是使用(SqlBulkCopy bulkCopy=newsqlbulkcopy(externalConnection,SqlBulkCopyOptions.KeepIdentity,transaction))将构造函数更改为
,它工作得非常好。非常感谢。
public static object SyncData()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("Internal Connection...");
    string internalConnectionString = GetConnectionString("ConnectionString");
    using (SqlConnection internalConnection = new SqlConnection(internalConnectionString))
    {
        internalConnection.Open();              
        SqlCommand selectCommand = internalConnection.CreateCommand();
        selectCommand.CommandTimeout = 180;
        try
        {
            selectCommand.CommandText = "SELECT * FROM dbo.test";
            SqlDataReader reader = selectCommand.ExecuteReader();

            sb.AppendLine("External Connection...");
            string externalConnectionString = GetConnectionString("ExternalConnectionString");
            using (SqlConnection externalConnection = new SqlConnection(externalConnectionString))
            {
                externalConnection.Open();              
                SqlCommand CRUDCommand = externalConnection.CreateCommand();
                CRUDCommand.CommandTimeout = 180;
                SqlTransaction transaction = externalConnection.BeginTransaction("test");
                CRUDCommand.Connection = externalConnection;
                CRUDCommand.Transaction = transaction;
                try
                {
                    CRUDCommand.CommandText = "DELETE FROM dbo.test";
                    sb.AppendLine("DELETE: Number of rows affected = " + CRUDCommand.ExecuteNonQuery());
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(externalConnection, SqlBulkCopyOptions.KeepIdentity, transaction))
                    {
                        try
                        {
                            bulkCopy.DestinationTableName = "dbo.test";
                            bulkCopy.BatchSize = 100;
                            bulkCopy.BulkCopyTimeout = 180;
                            bulkCopy.WriteToServer(reader);

                            sb.AppendLine("Table data copied successfully");

                            transaction.Commit();
                            sb.AppendLine("Transaction committed.");
                        }
                        catch (Exception ex)
                        {
                            sb.AppendLine("BULK COPY Commit Exception Type: {0}" + ex.GetType());
                            sb.AppendLine("  BULK COPY Message: {0}" + ex.Message);
                            try
                            {
                                transaction.Rollback();
                            }
                            catch (Exception ex2)
                            {
                                sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType());
                                sb.AppendLine("  Message: {0}" + ex2.Message);
                            }
                        }
                        finally
                        {
                            reader.Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    sb.AppendLine("Commit Exception Type: {0}" + ex.GetType());
                    sb.AppendLine("  Message: {0}" + ex.Message);

                    try
                    {
                        transaction.Rollback();
                    }
                    catch (Exception ex2)
                    {
                        sb.AppendLine("Rollback Exception Type: {0}" + ex2.GetType());
                        sb.AppendLine("  Message: {0}" + ex2.Message);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            sb.AppendLine("Commit Exception Type: {0}" + ex.GetType());
            sb.AppendLine("  Message: {0}" + ex.Message);
        }
    }
    return sb.ToString();
}