NonSoft

SQL SERVERのバックアップ/リストア(復元)
のサンプル(C#.NET)


 サンプル(ソース/コード)
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();
        }
    }
}