0

バックアップ:

private void Button1_Click(object sender, EventArgs e)
{
   SqlCommand cmd = new SqlCommand("backup database emp to disk ='C:\\emp.bak'", con);
    con.Open();
    cmd.ExecuteNonQuery();
    // ExecutenonQuery();
    con.Close();
}

しかし、復元すると:

private void Button2_Click(object sender, EventArgs e)
{
    SqlCommand cmd = new SqlCommand("restore database emp from  disk ='C:\\emp.bak'", con);
    con.Open();
    cmd.ExecuteNonQuery();
    // ExecutenonQuery();
    con.Close();
}

エラーが発生します:

このセッションで使用中のため、RESTORE はデータベース 'emp' を処理できません。この操作を実行するときは、master データベースを使用することをお勧めします。RESTORE DATABASE が異常終了しています。

誰でも私を助けてください

4

4 に答える 4

1

それが示唆するように、マスターデータベースを使用する必要があるかもしれません。

SMO ライブラリを使用しませんか? down は、SMO を使用してデータベースをバックアップおよび復元する方法の例です。

バックアップの方法

Server server = new Server(sqlServer);

var bdi = new BackupDeviceItem(String.Format(@"C:\Opticien\Data\Sauvegardes\{0}", backupName), DeviceType.File);
var backup = new Backup() { Database = databaseName, Initialize = true };
backup.Devices.Add(bdi);

backup.SqlBackup(server);

復元方法:

var server = new Server(sqlServer);
var restore = new Restore()
{
     Database = database,
     Action = RestoreActionType.Database,
     ReplaceDatabase = true,
};
restore.Devices.AddDevice(backupPath, DeviceType.File);
var dt = restore.ReadFileList(server);
var dLogicalName = dt.Rows[0]["LogicalName"].ToString();

restore.RelocateFiles.Add(new RelocateFile(dLogicalName, String.Format(@"C:\Opticien\Data\{0}.mdf", database)));
restore.RelocateFiles.Add(new RelocateFile(dLogicalName + "_Log", String.Format(@"C:\Opticien\Data\{0}.ldf", database)));

restore.SqlRestore(server);

幸運を

于 2012-07-15T12:25:22.500 に答える
0

通常、復元コマンドを発行するときは、SQL データベースをシングル ユーザー モードにして、他のプロセスが同じデータベースを使用していないことを保証できるようにする必要があります。その時点で他の誰かが DB を使用している場合、現在表示されているようなエラーが発生します。

シングルユーザーのドキュメントをご覧ください

于 2012-07-15T11:09:14.750 に答える
0

復元する前に、現在のセッションを強制終了することを検討してください。

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

詳細については:

SQL Server 2005 データベースへの現在の接続をすべて終了するにはどうすればよいですか?

于 2012-07-15T11:12:28.723 に答える
0

SQL データベースを復元する場合は、プロセスがこのデータベースを使用していないことを確認してください。データベースを復元するには、別の名前を使用することをお勧めします。私は自分の答えを編集します:

DECLARE @SPId int
DECLARE @SQL nvarchar(100)

--SET @DatabaseName = N'AdventureWorks2008'
SET @DatabaseName = DB_NAME()
DECLARE my_cursor CURSOR FAST_FORWARD FOR
SELECT SPId FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

OPEN my_cursor

FETCH NEXT FROM my_cursor INTO @SPId

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'KILL ' + CAST(@SPId as nvarchar(10))
print @SQL
EXEC sp_executeSQL @SQL
--KILL @SPId -- Causing Incorrect syntax near '@spid'.

FETCH NEXT FROM my_cursor INTO @SPId
END

CLOSE my_cursor
DEALLOCATE my_cursor
于 2012-07-15T11:14:26.417 に答える