2010-11-18 10 views
14

Ich versuche, die Datenbank so restaurieren wiederherzustellen:Wie SQL Server-Datenbank über C# -Code

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 
       Cmd = new SqlCommand(SQL, Conn); 
       Cmd.ExecuteNonQuery(); 
       Cmd.Dispose(); 

aber ich habe immer Fehler:

Msg 3102, Level 16, State 1, Line 7
RESTORE cannot process database 'MyDataBase ' because it is in use by this session. It is recommended that the master database be used when performing this operation.
Msg 3013, Level 16, State 1, Line 7
RESTORE DATABASE is terminating abnormally.

Antwort

1

Sie müssen über eine auf dem Datenbankserver verbinden andere Datenbank

Damit Ihre Verbindungszeichenfolge sagen Sie "Master" oder eine andere Datenbank auf dem Server, dann können Sie die Aufgabe fertig stellen.

1

Ihre Verbindungszeichenfolge sollte eine master Datenbank als Standardkatalog zum Herstellen einer Verbindung haben.

12

Ihre Datenbankverbindung ist höchstwahrscheinlich mit der Datenbank verbunden, die Sie wiederherstellen möchten. So gibt es eine DB Sperre geteilt, die die Wiederherstellung Ihres db verhindert

Versuchen Sie, diese

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'"; 

Oder die Verbindungsdetails Master DB

+0

Entschuldigung !!! Ich brauche ich versuche, diese wiederherzustellen: RESTORE DATABASE MyDatabase FROM DISK = 'd: \ MyDatabase.bak' und bekam diesen Fehler – Gold

+0

ich versuche dies: USE MASTER RESTORE mydatabase TO DISK = 'd: \ MyDATA.BAK aber immer noch diesen Fehler: Msg 3159, Ebene 16, Status 1, Zeile 7 Das Ende des Protokolls für die Datenbank "MyDataBase" wurde nicht gesichert. Verwenden Sie BACKUP LOG WITH NORECOVERY, um das Protokoll zu sichern, wenn es Arbeit enthält, die Sie nicht verlieren möchten. Verwenden Sie die Klausel WITH REPLACE oder WITH STOPAT der Anweisung RESTORE, um nur den Inhalt des Protokolls zu überschreiben. Nachricht 3013, Ebene 16, Status 1, Zeile 7 RESTORE DATABASE wird abnormal beendet. – Gold

14

Ich ziehe SMO verwenden ändern zu verwenden, um eine Sicherung wiederherzustellen:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
    new Server(new ServerConnection(server)); 

Database db = smoServer.Databases['MyDataBase']; 
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf'); 
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf'); 
Restore restore = new Restore(); 
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File); 
restore.Devices.Add(deviceItem); 
restore.Database = backupDatabaseTo; 
restore.FileNumber = restoreFileNumber; 
restore.Action = RestoreActionType.Database; 
restore.ReplaceDatabase = true; 
restore.SqlRestore(smoServer); 

db = smoServer.Databases['MyDataBase']; 
db.SetOnline(); 
smoServer.Refresh(); 
db.Refresh(); 

Sie müssen Verweise auf Microsoft.SqlServer.Smo, Microsoft.SqlServer.SmoExtended und Microsoft.SqlServer.Management.Sdk.Sfc

+2

Auf meinem Computer befanden sich die erforderlichen DLLs für den Zugriff auf diese Bibliotheken in C: \ Programme (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies (weil SQL Server Management Studio als Teil von SQL Server Express 2008 R2 installiert ist). und ich musste zu diesem Ordner wechseln und hinzufügen: Microsoft.SqlServer.ConnectionInfo.dll, Microsoft.SqlServer.Management.Sdk.Sfc.dll, Microsoft.SqlServer.Smo.dll, Microsoft.SqlServer.SmoExtended.dll. –

+1

Warum die dbPath- und logPath-Zeilen? Sie scheinen nicht notwendig zu sein. Sie können dies auch etwas prägnanter machen, indem Sie restore.Devices.AddDevice verwenden (und die Argumente übergeben, die Sie im neuen BackupDeviceItem –

+0

@ChrisMoschini verwendet haben. Ich glaube, er wollte etwas tun wie: RelocateFile relocateDataFile = new RelocateFile (restore.ReadFileList (smoServer)). Zeilen [0] [0] .ToString(), dbPath); restore.RelocateFiles.Add (relocateDataFile); – petric