SQL Backup erstellen



  • Hallo vielleicht könnt ihr mir ja weiterhelfen.

    Ich möchte ein Backup meiner Datenbank erstellen (später natürlich wieder einspielen, aber erstmal erstellen).

    Leider finde ich nur Beispiele in Visual C#.
    Ich möchte dies aber in Visual C++ machen.

    Eigentlich doch nicht so schwer?

    Ich finde dieses Beispiel schon recht schön.
    [url]
    http://www.codeproject.com/KB/database/SQL_Server_2005_Database.aspx?display=Print
    [/url]
    SMO, kannte ich vorher nicht, aber sieht schön aus.

    Verbindung mit der DB herstellen paßt,
    auch die usings sind in Ordnung.

    using namespace System::Data::SqlClient;
    	using namespace Microsoft::SqlServer::Management::Common;
        using namespace Microsoft::SqlServer::Management::Smo;
    

    Jetzt habe ich aber das Problem, dass wenn ich

    Backup backup = gcnew Backup();        //Zeile 149
    backup.Action = BackupActionType::Database;  //Zeile 150
    

    das Backup Objekt erstellen möchte, da mein Compiler meckert

    Fehler 1 error C3673: "Microsoft::SqlServer::Management::Smo::Backup": Die Klasse hat keinen Kopierkonstruktor. c:\users\dirk\documents\visual studio 2008\projects\testform\testform\Backup_erstellen.h 149 TestForm

    Was ist falsch?

    Oder wie kann ichs am besten realisieren ein Backup zu erstellen?



  • Backup^ backup = gcnew Backup();
    


  • Ok, danke. So weit geht es schon mal.



  • Naja gut, so richtig klappts noch nicht.

    Ich habe jetzt folgendes:

    // Backup in eine angegebene Datei erstellen
    Backup^ backup = gcnew Backup();
    backup->Action = BackupActionType::Database;
    backup->BackupSetDescription = "ArchiveDataBase:" + DateTime::Now.ToShortDateString();
    backup->BackupSetName = "Archive";
    backup->Database = "C:\\USERS\\DIRK\\DOCUMENTS\\REGALLAGER_DB_DATEI.MDF";  //Name der Datenbank?
    
    String^ destinationPath = "C:\\Users\\dirk\\Documents\\";
    String^ serverName = ".\SQLEXPRESS";
    String^ userName = " ";
    String^ password = " ";
    String^ databaseName = "REGALLAGER_DB_DATEI.MDF"  ;
    
    BackupDeviceItem^ deviceItem = gcnew BackupDeviceItem(destinationPath, DeviceType::File);
    //ServerConnection^ connection = gcnew ServerConnection(serverName, userName, password);
    //Server^ sqlServer = gcnew Server(connection);
    
     //Verbinden mit SQL Server  
    SqlConnection^ sqlConnection = 
          gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Users\\dirk\\Documents\\Regallager_db_datei.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
    
    //"serverConnection" mit der "sqlConnection" Information
    Microsoft::SqlServer::Management::Common::ServerConnection^ serverConnection = 
    		gcnew Microsoft::SqlServer::Management::Common::ServerConnection(sqlConnection);
    
    Microsoft::SqlServer::Management::Smo::Server^ sqlServer  = gcnew Server(serverConnection);
    
    Database^ db = sqlServer->Databases[databaseName];
    //jetzt verbunden....
    
    backup->Initialize = true;
    backup->Checksum = true;
    backup->ContinueAfterError = true;
    
    backup->Devices-> Add(deviceItem);
    backup->Incremental = false;
    
    backup->ExpirationDate = DateTime::Now.AddDays(3);
    backup->LogTruncation = BackupTruncateLogType::Truncate;
    
    backup->FormatMedia = false;
    
    backup->SqlBackup(sqlServer);
    

    aber leider wird eine Failed Operation Exception geworfen. (bei backup->SqlBackup(sqlServer);

    Jetzt bin ich schon ein wenig Ratlos.

    😕



  • Na, schau Dir doch mal den Inhalt der Exception an...



  • Das sagt mir nichts.

    Es steht da:

    Fehler bei Sichern für Server 'SCHLEPPI\SQLEXPRESS'.

    Habe auch schon in den Details geschaut, aber da werde ich leider auch nicht schlau drauß.



  • OK, noch ein wenig "tiefer" in den Details rumgesucht finde ich folgendes:

    Unter InnerException steht:

    {"Für den EXPIREDATE-Parameter wurde ein ungültiger Wert angegeben.\r\nBACKUP DATABASE wird fehlerbedingt beendet."}



  • Halt,

    liegt an der Zeile

    backup->ExpirationDate = DateTime::Now.AddDays(3);

    habe sie auskommentiert, jetzt kommt ein neuer Fehler.

    {"Das Sicherungsmedium 'C:\\Users\\dirk\\Documents\' kann nicht geöffnet werden. Betriebssystemfehler 3(Das System kann den angegebenen Pfad nicht finden.).\r\nBACKUP DATABASE wird fehlerbedingt beendet."}



  • Na gut,

    Fehler gefunden.

    String^ destinationPath = "C:\\Users\\dirk\\Documents\\REGALLAGER_DB_DATEI.BK";

    sollte es heißen. Denke mal das ich es .bk nennen muss.

    Trotzdem danke für den Tipp, hätte mir die Details sonst nicht mehr so genau angeschaut. Na hoffentlich wird das wiederherstellen der DB aus dem BK nun nicht ganz so ne schwere Geburt.



  • Na so recht komme ich mit dem Restore noch nicht klar.

    Folgendes läßt sich zwar compilieren,

    Restore^ sqlRestore = gcnew Restore();
    
    String^ serverName = ".\\SQLEXPRESS";
    String^ filePath = "C:\\Users\\dirk\\Documents\\BackupDB\\REGALLAGER_DB_DATEI.BAK";
    String^ databaseName = "New_REGALLAGER_DB_DATEI.MDF";
    String^ databaseName2 = "REGALLAGER_DB_DATEI_log";
    String^ dataFilePath = "C:\\Users\\dirk\\Documents\\";
    String^ logFilePath = "C:\\Users\\dirk\\Documents\\";
    
    BackupDeviceItem^ deviceItem = gcnew BackupDeviceItem(filePath, DeviceType::File);
    sqlRestore->Devices->Add(deviceItem);
    sqlRestore->Database = databaseName;
    
     //Verbinden mit SQL Server  
    SqlConnection^ sqlConnection = 
          gcnew SqlConnection("Data Source=.\\SQLEXPRESS;Integrated Security=True;User Instance=True ");  //;Integrated Security=True;Connect Timeout=30;User Instance=True");
    
    //"serverConnection" mit der "sqlConnection" Information
    Microsoft::SqlServer::Management::Common::ServerConnection^ serverConnection = 
    		gcnew Microsoft::SqlServer::Management::Common::ServerConnection(sqlConnection);
    
    Microsoft::SqlServer::Management::Smo::Server^ sqlServer  = gcnew Server(serverConnection);
    
    Database^ db = sqlServer->Databases[databaseName];
    //jetzt verbunden....
    
    // Restore aus der angegebenen Datei
    String^ backupFileName = "C:\\Users\\dirk\\Documents\\BackupDB\\REGALLAGER_DB_DATEI.BAK";
    Restore^ restore = gcnew Restore();
    restore->Action = RestoreActionType::Files;
    restore->NoRecovery = true;
    
    restore->ReplaceDatabase = true; 
    restore->Database = databaseName;
            /* if (restore->PercentComplete != NULL)
             {
                restore->PercentComplete += restore->PercentComplete;
             }*/
    restore->Devices->Add(gcnew BackupDeviceItem(backupFileName, DeviceType::File));
    restore->SqlRestore(sqlServer);
    

    aber wieder habe ich eine Exception.

    *Die Datei 'C:\\Users\\dirk\\Documents\\Regallager_db_datei.mdf' kann nicht überschrieben werden.
    Sie wird von der 'C:\\USERS\\DIRK\\DOCUMENTS\\REGALLAGER_DB_DATEI.MDF'-Datenbank verwendet.\r\
    Die Datei 'Regallager_db_datei' kann nicht in 'C:\\Users\\dirk\\Documents\\Regallager_db_datei.mdf' wiederhergestellt werden.
    Verwenden Sie WITH MOVE, um einen gültigen Speicherort für die Datei zu identifizieren.\r\n
    Die Datei 'C:\\Users\\dirk\\Documents\\Regallager_db_datei_log.ldf' kann nicht überschrieben werden.
    Sie wird von der 'C:\\USERS\\DIRK\\DOCUMENTS\\REGALLAGER_DB_DATEI.MDF'-Datenbank verwendet.\r\
    Die Datei 'Regallager_db_datei_log' kann nicht in 'C:\\Users\\dirk\\Documents\\Regallager_db_datei_log.ldf'
    wiederhergestellt werden.
    Verwenden Sie WITH MOVE, um einen gültigen Speicherort für die Datei zu identifizieren.\r\n
    Beim Planen der RESTORE-Anweisung wurden Probleme gefunden.
    Vorausgehende Meldungen enthalten ausführliche Informationen.\r\n
    RESTORE DATABASE wird fehlerbedingt beendet.

    Ich habe jetzt zwar schon einiges Probiert, aber leider bin ich zu keiner Lösung gekommen.



  • Problem leider immer noch nicht gelöst 😞



  • Lesen hilft doch:

    Die Datei 'C:\\Users\\dirk\\Documents\\Regallager_db_datei.mdf' kann nicht überschrieben werden.
    Sie wird von der 'C:\\USERS\\DIRK\\DOCUMENTS\\REGALLAGER_DB_DATEI.MDF'-Datenbank verwendet.\r\
    Die Datei 'Regallager_db_datei' kann nicht in 'C:\\Users\\dirk\\Documents\\Regallager_db_datei.mdf' wiederhergestellt werden.
    Verwenden Sie WITH MOVE, um einen gültigen Speicherort für die Datei zu identifizieren.\r\n


Anmelden zum Antworten