Fehler beim Kopieren einer externen SQL Datenbank mit Hilfe der Transfer Klasse

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Apollo3zehn.

    Fehler beim Kopieren einer externen SQL Datenbank mit Hilfe der Transfer Klasse

    Moin Moin,

    ich habe ein Problem beim Kopieren einer externen Datenbank in die lokale SQLEXPRESS Instanz. Ich muss einigermaßen regelmäßig diese Datenbank kopieren, wobei dort nur die Tabellen und Schlüssel wichtig sind.

    Der Aufbau ist folgender:

    Quelle: Instanz des externen Servers: [Servername]\WIND
    Ziel: Instanz des lokalen Servers: Tablet02\SQLEXPRESS

    Name Quell- und Zieldatenbank: "Autotexte"

    Ich habe es dazu mit der Transfer Klasse probiert, wobei immer folgender Fehler auftritt:



    Der Code, den ich benutze ist folgender:

    VB.NET-Quellcode

    1. Dim ServerRemote As New Server(ServerConnectionData.ServerConnectionRemote("Autotexte"))
    2. Dim ServerLocal As New Server(ServerConnectionData.ServerConnectionLocal("Autotexte"))
    3. Dim tmpConn As SqlConnection = ServerConnectionData.TestConnection(True)
    4. tmpConn.Open()
    5. Dim cmd As New SqlCommand("IF db_id('Autotexte') IS NOT NULL " + _
    6. "BEGIN " + _
    7. "ALTER DATABASE Autotexte SET OFFLINE WITH ROLLBACK IMMEDIATE; " + _
    8. "ALTER DATABASE Autotexte SET ONLINE WITH ROLLBACK IMMEDIATE; " + _
    9. "DROP DATABASE Autotexte; " + _
    10. "END", tmpConn)
    11. cmd.ExecuteNonQuery()
    12. tmpConn.Close()
    13. Transfer = New Transfer(ServerRemote.Databases("Autotexte"))
    14. Transfer.DestinationServer = ServerLocal.Name
    15. Transfer.DestinationDatabase = "Autotexte"
    16. Transfer.DestinationLoginSecure = False
    17. Transfer.DestinationLogin = ServerConnectionData.LogInName
    18. Transfer.DestinationPassword = ServerConnectionData.LocalServerPassword
    19. Transfer.CreateTargetDatabase = True
    20. Transfer.CopyAllObjects = False
    21. Transfer.CopyAllTables = True
    22. Transfer.Options.WithDependencies = True
    23. Transfer.Options.DriAllKeys = True
    24. Transfer.CopySchema = True
    25. Transfer.CopyData = True
    26. Try
    27. Transfer.TransferData()
    28. Catch ex As Exception
    29. MessageBox.Show(ex.ToString, "", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    30. End Try
    31. MessageBox.Show("Die Übertragung wurde beendet.")


    Der folgende Code zeigt nur, wie die ServerConnection für den Konstruktor der Server Klasse gebildet wird, falls dies wichtig ist:

    VB.NET-Quellcode

    1. Friend Shared ReadOnly Property ServerConnectionLocal() As ServerConnection
    2. Get
    3. Dim _ServerConnectionLocal As New ServerConnection
    4. _ServerConnectionLocal.LoginSecure = False
    5. _ServerConnectionLocal.Login = _LogInName
    6. _ServerConnectionLocal.Password = _LocalServerPassword
    7. _ServerConnectionLocal.ServerInstance = System.Environment.MachineName + "\SQLEXPRESS"
    8. Return _ServerConnectionLocal
    9. End Get
    10. End Property
    11. Friend Shared ReadOnly Property ServerConnectionRemote() As ServerConnection
    12. Get
    13. Dim _ServerConnectionRemote As New ServerConnection
    14. _ServerConnectionRemote.LoginSecure = False
    15. _ServerConnectionRemote.Login = _LogInName
    16. _ServerConnectionRemote.Password = _RemoteServerPassword
    17. _ServerConnectionRemote.ServerInstance = _RemoteServerName + "\" + _RemoteServerInstance
    18. Return _ServerConnectionRemote
    19. End Get
    20. End Property


    Ich bin nicht ganz sicher, wo ich nach dem Fehler suchen muss. Die Datenbank exisitert auf jedenfall beim externen Server und auch genau unter diesem Pfad. Ich kann mir also nur vorstellen, dass er lokal nach diesem Pfad sucht, aber wenn ja, warum? Kann ich nur von lokal nach extern kopieren und nicht andersherum, wie ich es benötige?

    Ich hoffe mir kann jemand helfen, ich bin schon am verweifeln =(

    Vielen Dank

    Vincent

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Apollo3zehn“ ()

    Ich habe das Problem lösen können. Es fehlten die Angaben:

    VB.NET-Quellcode

    1. Transfer.TargetDatabaseFilePath = "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\"
    2. Transfer.TargetLogFilePath = "C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\"


    Ohne diese Angaben hat er in einem nicht vorhandenen Verzeichnis gesucht (MSSQL11.WIND).
    sieht sehr interessant aus.
    Jetzt hab ich im ObjectBrowser diese Transfer-Klasse gesucht, und finde sie nicht. Muss man da iwas ganz besonderes für einbinden?
    Weil der Fehler spricht ja auch von "Microsoft.SqlServer.Management..."

    Oder liegt das daran, dassichnur SqlServerExpress habe, und du Vollversion?
    Ich habe nochmal nachgeschaut, auf die Transfer Klasse lässt sich folgendermaßen zugreifen:

    Microsoft.SqlServer.Management.Smo.Transfer

    zu finden in C:\Program Files\110\SDK\Assemblies\Microsoft.SqlServer.Management.SmoExtended

    ich bin nicht sicher, ob noch weitere Verweise nötig waren, da ich auch noch auf C:\Program Files\110\SDK\Assemblies\Microsoft.SqlServer.Management.Smo verwiesen habe.

    Importiert habe ich:

    VB.NET-Quellcode

    1. Imports Microsoft.SqlServer.Management.Common
    2. Imports Microsoft.SqlServer.Management.Smo


    Viel Erfolg

    Vincent