|
|||||
SQL SERVERのデータベースをバックアップ/リストア(復元)するサンプル(C#.NET)です。 バックアップは次のSQLを実行しています。 BACKUP DATABASE TEST TO DISK = 'C:\Temp\TEST.bak' WITH FORMAT,NAME = 'Full Backup of TEST'; リストア(復元)は次のSQLを実行しています。 RESTORE DATABASE TEST FROM DISK = 'C:\Temp\TEST.bak' リストア(復元)用のSQLは、 DB接続しているセッション(ユーザ)が一つも無い時だけ実行出来ますので、 事前に全てのDB接続セッション(ユーザ)を切断する必要があります。 まず次のSQLで、全てのDB接続セッション(ユーザ)を取得します。 SELECT spid FROM master..sysprocesses,master..sysdatabases WHERE master..sysprocesses.dbid = master..sysdatabases.dbid AND name = 'TEST'; そして次のSQLで、個々のDB接続セッション(ユーザ)を強制切断します。 KILL <spid> VB.NET版のサンプルソースはこちらです。 SQL SERVERのバックアップ/リストア(復元)のサンプル(VB.NET) その他のサンプル(データベース操作等)はこちらです。 サンプルソース(コード) ★フォーム(Form1.cs) public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { // SQLサーバ(localhost)のマスタDB(master)に接続する System.Data.SqlClient.SqlConnection _con = new System.Data.SqlClient.SqlConnection(); _con.ConnectionString = "Server=localhost;" + "Database=master;" + "User ID=sa;" + "Password=;"; _con.Open(); // テストDB(TEST)をバックアップ(C:\Temp\TEST.bak)するSQL作成 String sql = @"BACKUP DATABASE TEST TO DISK = 'C:\Temp\TEST.bak' " + @"WITH FORMAT,NAME = 'Full Backup of TEST';"; System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(sql, _con); System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(sqlCommand); // バックアップ開始 DataTable dt = new DataTable(); adapter.Fill(dt); // バックアップSQLの解放 adapter.Dispose(); sqlCommand.Dispose(); // SQLサーバ(localhost)のマスタDB(master)から切断する _con.Close(); } private void button2_Click(object sender, EventArgs e) { // SQLサーバ(localhost)のマスタDB(master)に接続する System.Data.SqlClient.SqlConnection _con = new System.Data.SqlClient.SqlConnection(); _con.ConnectionString = "Server=localhost;" + "Database=master;" + "User ID=sa;" + "Password=;"; _con.Open(); // テストDB(TEST)をリストア(復元)(C:\Temp\TEST.bak)するSQL作成 String sql = @"RESTORE DATABASE TEST FROM DISK = 'C:\Temp\TEST.bak';"; System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(sql, _con); System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(sqlCommand); // リストア(復元)SQLはDB接続しているセッションが存在すると失敗するので、 // 事前に全てのDB接続を切断して置くする必要があります。 Kill_User(_con); // リストア(復元)開始 DataTable dt = new DataTable(); adapter.Fill(dt); // リストア(復元)SQLの解放 adapter.Dispose(); sqlCommand.Dispose(); // SQLサーバ(localhost)のマスタDB(master)から切断する _con.Close(); } private void Kill_User(System.Data.SqlClient.SqlConnection _con) { // 全てのDB接続セッション取得SQL作成 String sql = @"SELECT spid FROM master..sysprocesses,master..sysdatabases " + @"WHERE master..sysprocesses.dbid = master..sysdatabases.dbid AND name = 'TEST';"; System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand(sql, _con); System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter(sqlCommand); // 全てのDB接続セッション取得 DataTable dt = new DataTable(); adapter.Fill(dt); // 全てのDB接続セッション取得SQLの解放 adapter.Dispose(); sqlCommand.Dispose(); for (int i = 0; i <= dt.Rows.Count - 1; i++) { // 個々のDB接続セッションを強制切断SQL作成 String sql2 = "KILL " + dt.Rows[i][0]; System.Data.SqlClient.SqlCommand sqlCommand2 = new System.Data.SqlClient.SqlCommand(sql2, _con); System.Data.SqlClient.SqlDataAdapter adapter2 = new System.Data.SqlClient.SqlDataAdapter(sqlCommand2); // 個々のDB接続セッションを強制切断 DataTable dt2 = new DataTable(); adapter2.Fill(dt2); // 個々のDB接続セッションを強制切断SQLの解放 adapter2.Dispose(); sqlCommand2.Dispose(); } } } |