【问题标题】:Accessing Azure SQL Server through SMO throws TransferException通过 SMO 访问 Azure SQL Server 抛出 TransferException
【发布时间】:2014-03-16 14:42:28
【问题描述】:

我正在尝试将一个 Azure SQL 数据库复制到位于同一服务器上的另一个。我正在使用 SMO (System.Data.SqlClient) 执行此操作。我知道这不是最有效的方法,但我的目的是利用此脚本在我的本地 SQL Server 上创建我的 Azure SQL 数据库的计划副本。

这是我的代码(Dev 是原始数据库,Dev-Mirror 是目标数据库):

var serverConnection = new ServerConnection();
        serverConnection.NetworkProtocol = NetworkProtocol.TcpIp;
        serverConnection.ConnectionString = "Server=tcp:mysernamename.database.windows.net,1433;User ID=user@server;Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;";
        var server = new Server(serverConnection);
        var transfer = new Transfer(server.Databases["Dev"]);
        transfer.CopyAllObjects = true;
        transfer.CopyAllUsers = true;
        transfer.Options.WithDependencies = true;
        transfer.DestinationDatabase = server.Databases["Dev-Mirror"].Name;
        transfer.DestinationServer = server.Name;
        transfer.DestinationLoginSecure = true;
        transfer.CopySchema = true;
        transfer.CopyData = true;
        transfer.Options.ContinueScriptingOnError = true;
        transfer.TransferData();

大约两分钟后,这段代码在执行 TransferData 后抛出以下 TransferException(但是,与服务器本身的连接是成功的,并且填充了 Server 实例上的 Databases 属性:

Microsoft.SqlServer.Management.Common.TransferException was unhandled
  HResult=-2146233088
  Message=An error occurred while transferring data. See the inner exception for details.
  Source=Microsoft.SqlServer.SmoExtended
  StackTrace:
       at Microsoft.SqlServer.Management.Smo.Transfer.TransferData()
       at SmoDatabaseCopy.Program.Main(String[] args) in c:\Users\bronf_000\Documents\Visual Studio 2013\Projects\SmoDatabaseCopy\SmoDatabaseCopy\Program.cs:line 32
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Data.SqlClient.SqlException
       HResult=-2146232060
       Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
       Source=.Net SqlClient Data Provider
       ErrorCode=-2146232060
       Class=20
       LineNumber=0
       Number=2
       Server=""
       State=0
       StackTrace:
            at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
            at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
            at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)
            at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
            at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
            at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
            at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData)
            at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
            at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
            at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
            at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
            at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
            at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
            at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
            at System.Data.SqlClient.SqlConnection.Open()
            at Microsoft.SqlServer.Management.Smo.Transfer.TransferData()
       InnerException: System.ComponentModel.Win32Exception
            HResult=-2147467259
            Message=The system cannot find the file specified
            ErrorCode=-2147467259
            NativeErrorCode=2
            InnerException: 

【问题讨论】:

    标签: c# sql azure azure-sql-database smo


    【解决方案1】:

    好的,显然答案比我想象的要容易。根据this 的说法,微软仅在 Azure SQL 上实现了部分 SMO,以支持使用此 API 的 SQL Server Management Studio。不建议在 Azure SQL 上实际使用 SMO API。

    【讨论】:

      【解决方案2】:

      我们最终使用了 Microsoft.Sql.Dac 库,该库允许对您选择的数据库执行完整备份和恢复(BAKPAK 和 BACPAC 文件)。这与 Azure 完美配合。

      【讨论】:

        猜你喜欢
        • 2011-05-18
        • 1970-01-01
        • 2010-12-13
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        相关资源
        最近更新 更多