以前の記事「【VB.NET】SQL Serverの指定したデータベースを復元(リストア)する(其の弐)」の応用です。

上記の記事では、復元に利用する論理名を指定する場合、SQL Server Management Studioで論理名を確認していました。
今回は、自動的に論理名を取得する方法について説明します。

論理名は、バックアップファイル内に記載されています。
そのため、バックアップファイルからこの情報を読み込む処理を追加することで実装できます。

各種ファイル情報を取得するには、Microsoft.SqlServer.Management.Smo.RestoreクラスのReadFileList()メソッドを取得します。
取得した各レコードの情報を参照することで、論理名等の必要な情報が取得できます。

ReadFileList()メソッドで取得した情報は、DataTable形式です。
そのため、DataTableRowを使って取得したデータの内容を参照する必要があります。
(複数のファイルがある場合には、DataTableRowが複数行取得できます)

以下、サンプル。
《事前準備》
 1.新しいWindowsアプリケーションプロジェクトを作成する。
 2.参照設定を追加する。
  1)メニューから[プロジェクト]-[参照の追加]を選択する。
  2)[.NET]タブを選択する。
  3)以下の《参照設定で追加するライブラリ》を選択し、[OK]ボタンを押す。
 3.フォームにボタン(Button)を配置する。
  →ボタンのコントロール名はデフォルトのままとします。

《参照設定で追加するライブラリ》
 1.Microsoft.SqlServer.Smo.DLL
  →SMOクラスの中核となるクラス・ライブラリ
   (Database、Server、Backup、Restore等)
 2.Microsoft.SqlServer.ConnectionInfo.DLL
  →SQL Serverオブジェクトへの接続の管理を支援するクラス・ライブラリ
 3.Microsoft.SqlServer.SqlEnum.dll
  →SMOで利用する列挙体の定義
 4.Microsoft.SqlServer.SmoEnum.dll
  →SQL Serverオブジェクトを一意に識別するためのクラス・ライブラリ
  「Uniform Resource Name(URN)アドレス」にアクセスするUrnクラス等)

《コード》
Imports Microsoft.SqlServer.Management.Smo

Public Class Form1
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

Try
'サーバへの接続情報を設定
Dim wkServer As New Server
wkServer.ConnectionContext.ServerInstance = "localhost"
wkServer.ConnectionContext.LoginSecure = True

'復元に利用するバックアップを指定
Dim wkRestore As New Restore
Dim backupFile As String
backupFile = "D:\test.bak"

'バックアップ装置を指定する
Dim Device As New BackupDeviceItem(backupFile, DeviceType.File)
wkRestore.Devices.Add(Device)

'バックアップが破損していないかどうかを確認する
'破損している場合は、エラーメッセージを表示して終了
Dim ErrorMessage As String = ""
If wkRestore.SqlVerify(wkServer, ErrorMessage) = False Then
MessageBox.Show(ErrorMessage, "エラー")
Exit Sub
End If

'復元するデータベースの指定
Dim destinationDBName As String
destinationDBName = "Sample1"

'復元するデータベースの論理名を取得する
Dim buckupFiles As DataTable
buckupFiles = wkRestore.ReadFileList(wkServer)

Dim relocateData As New RelocateFile()
Dim relocateLog As New RelocateFile()

For Each buckupFilesRow As DataRow In buckupFiles.Rows
If "D".Equals(buckupFilesRow(2)) Then
relocateData.LogicalFileName = buckupFilesRow(0)
relocateData.PhysicalFileName = "D:\" + buckupFilesRow(0) + "_1" + ".mdf"
ElseIf "L".Equals(buckupFilesRow(2)) Then
relocateLog.LogicalFileName = buckupFilesRow(0)
relocateLog.PhysicalFileName = "D:\" + buckupFilesRow(0) + "_1" + ".ldf"
End If
Next

wkRestore.RelocateFiles.Add(relocateData)
wkRestore.RelocateFiles.Add(relocateLog)

'復元(リストア)の動作を決める
wkRestore.Action = RestoreActionType.Database
wkRestore.Database = destinationDBName
wkRestore.PercentCompleteNotification = 10

'復元(リストア)の実行
wkRestore.SqlRestore(wkServer)

MessageBox.Show("完了", "通知")
Catch ex As Exception
MessageBox.Show(ex.Message, "エラー")
End Try
End Sub
End Class

【補足事項】
・ReadFileList()で取得したデータの要素(列)についてです。
 最初の要素 … 論理名
 3番目の要素 … データファイルかログファイルかを示す文字列
  (データファイルの場合は"D"、ログファイルの場合は"L")