VS2005(VB)にて「新しい項目の追加」で追加できる「SQLデータベース」を使用した単体Windowsアプリケーションを作成しています。
このデータベースのバックアップ・復元方法についてどなたか教えていただけますと大変助かります。
こちらを参考にデータベースのバックアップと復元のコードを作成しましたが復元部分でエラーとなってしまいます。
http://msdn.microsoft.com/ja-jp/library/ms162133.aspx
Imports Microsoft.SqlServer.Management.smo
Sub DB_BACKUP()
'データベースのバックアップ
'SQLサーバーのローカルのデフォルトインスタンスに接続
Dim srv As Server = New Server
srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\DBファイル.mdf;Integrated Security=True;User Instance=True"
'データベースの参照設定
Dim db As Database = srv.Databases("C:\DBファイル.mdf")
'回復モデル
Dim recoverymod As Integer = db.DatabaseOptions.RecoveryModel
'Backupオブジェクト変数の定義
Dim bk As New Backup
'バックアップのタイプ、記述、名前、データベースの指定
bk.Action = BackupActionType.Database
bk.Database = "C:\DBファイル.mdf"
'バックアップデバイスのタイプの指定(ファイル)
Dim bdi As BackupDeviceItem = New BackupDeviceItem("C:\DBファイル.bak", DeviceType.File)
'Backupオブジェクトにデバイスを追加
bk.Devices.Add(bdi)
'完全なデータベースバックアップであると指定
bk.Incremental = False
'バックアップの有効期限
Dim backupdate As Date = New Date(2010, 10, 5)
bk.ExpirationDate = backupdate
'ログの切捨て
bk.LogTruncation = BackupTruncateLogType.Truncate
'完全バックアップの実行
bk.SqlBackup(srv)
MessageBox.Show("データベースのバックアップが完了しました。")
End Sub
Sub DB_RESTORE()
’データベースの復元
Try
'SQLサーバーのインスタンスに接続
Dim srv As Server = New Server
srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\DBファイル.mdf;Integrated Security=True;User Instance=True"
'バックアップデバイスの指定(ファイル)
Dim bdi As BackupDeviceItem = New BackupDeviceItem("C:\DBファイル.bak", DeviceType.File)
'Restoreオブジェクト変数定義
Dim rs As Restore = New Restore
'取引が回復されないようにNoRecoveryの特性を本当に設定してください。
rs.NoRecovery = False
'完全なデータベースバックアップをRestoreオブジェクトに含むデバイスを加えてください。
rs.Devices.Add(bdi)
'データベース名の指定
rs.Database = "C:\DBファイル.mdf"
'データベースの復元
rs.SqlRestore(srv) (※)
MessageBox.Show("データベースの復元が完了しました。")
Catch ex As Exception
MessageBox.Show(ex.Message, "エラー")
End Try
End Sub
上記コードで実行してみますとバックアップファイルは作成されますが、
復元を実行しますと
※印の rs.SqlRestore(srv) の部分で
「サーバー(コンピュータ名)の復元に失敗しました」のエラーととなります。
エラーとなる原因のヒントまたは別な方法がありましたら宜しくお願いします。
ManagementStudioで手動で復元する際の設定で・・・
上書きを行うようにしないと、既存のDBに復元
できませんせんよね?!
多分、そうだと思うので、上書きを許可するよう
にして復元してみて下さい。
あ!
それと・・・
SQLデータベースで作成したものは、そのDBのストアドに
登録されていると思いますが、そうしますと、自分自身に
上書きすることになるはずなので、この場合、そのDBに
接続したまま上書きはできない・・・と思いますが・・・
ご検討下さい。
※ そうじゃない?
違っていたらすいません・・・
以上。
オショウ様
書込みありがとうございます。
ManagementStudioでの復元処理は問題なく出来るのですが
今回はコードで復元処理をしたく困っておりました。
ちなみにManagementStudioでSQL EXPRESSのデータベースを作成した場合は
上記のコードでのバックアップ・復元処理は出来ています。
※srv.ConnectionContext.ConnectionString =・・・の部分を
srv.ConnectionContext.ConnectionString ="localhost\SQLEXPRESS"に
変更しています。
という事はRestoreの設定で何か足りないか、
VSで追加したSQLデータベースファイルはこの方法では実現できないという事になるのでしょうか・・・。
http://blog.livedoor.jp/akf0/archives/51482492.html
ここのコードが参考になりませんか?
後半にはいろいろカキコありましたが・・・
以上。参考まで
オショウ様
お世話になっております。
教えていただきましたコードも参考に色々と試してみました。
結果として復元処理を行う前に一度データベースへ接続・接続解除していますので、
試しに復元処理を実行する前に
SqlConnection.ClearPool(・・・)で接続プールを空にしたところ
復元処理がうまくいきました。
結局のところ接続したままの状態で上書きしようとした為エラーとなっていたようですね・・・。
(接続解除していますので問題ないと思っていました。)
この度は大変助かりました。ありがとうございました。
上記で試しても中々上手くいかなかったので補足しておきます。
バックアップコード DB_BACKUP()の
最後に
srv.DetachDatabase([アタッチmdfファイルのパス], False)
を追加してバックアップの接続を解放
リストアコードは以下のようにして上手くいきました。
Private Sub DB_Restore()
Dim srv As New Server
Dim rs As New Restore
Dim dbNm As String = [アタッチmdfファイルのパス]
Dim backupFile As String = "C:\DBファイル.bak"
Try
'復元に利用するバックアップを指定
Me.Cursor = Cursors.WaitCursor
'サーバへの接続情報を設定
srv.ConnectionContext.ConnectionString = "Data Source=.\SQLEXPRESS;Integrated Security=True;AttachDbFilename=" & dbNm & ";" & User Instance=True"
srv.Databases(dbNm).Drop()
'バックアップ装置を指定する
Dim bdi As New BackupDeviceItem(backupFile, DeviceType.File)
rs.Devices.Add(bdi)
'復元(リストア)の動作を決める
rs.NoRecovery = False
rs.ReplaceDatabase = True
rs.Action = RestoreActionType.Database
rs.Database = dbNm
rs.PercentCompleteNotification = 10
'復元(リストア)の実行
rs.SqlRestore(srv)
MessageBox.Show("完了", "通知")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Exclamation)
Finally
Me.Cursor = Cursors.Default
End Try
End Sub