winformアプリケーションからデータベースのバックアップと復元のスクリプトを実行するにはどうすればよいですか?
-
08-07-2019 - |
質問
Sqlserver 2005データベースを使用する小規模ビジネスアプリケーションを開発しています。
プラットフォーム:.Net framework 3.5; アプリケーションの種類:Windowsアプリケーション。 言語:C#
質問:
アプリケーションからバックアップを取得して復元する必要があります。 SSMEから生成された必要なスクリプトがあります。
winformアプリケーションから特定のスクリプトを実行するにはどうすればよいですか
解決
これらのスクリプトは、クエリを実行するのと同じ方法で実行できます。復元するデータベースに接続しないで、代わりにマスターに接続します。
他のヒント
アプリケーションを実行しているコンピューターにSQL Serverクライアントツールがインストールされている場合は、 sqlcmd 。
データベースへの接続(ADOと思われますか?)を使用し、この接続を介して単純なTSQL命令をサーバーに送信します。
バックアップには、おそらくxp_sqlmaintを使用する必要があります。古いバックアップを削除する便利な機能があり、素晴らしいログファイルを作成します。次のような方法で呼び出すことができます。 EXECUTE master.dbo.xp_sqlmaint N ''-S <!> quot; [サーバー名] <!> quot; [ServerLogonDetails] -D [データベース名] -Rpt <!> quot; [BackupArchive] \ BackupLog.txt <!> quot; [RptExpirationSchedule] -CkDB -BkUpDB <!> quot; [BackupArchive] <!> quot; -BkUpMedia DISK [BakExpirationSchedule] ''
([角括弧]を適切な値に置き換えます。)
バックアップについても、トランザクションログのバックアップが必要になる場合があります。何かのようなもの: IF DATABASEPROPERTYEX((SELECT db_name(dbid)FROM master..sysprocesses WHERE spid = @@ SPID))、 '' Recovery '')<!> lt; <!> gt; ''シンプル '' EXECUTE master.dbo.xp_sqlmaint N '' -S <!> quot; [ServerName] <!> quot; [ServerLogonDetails] -D [データベース名] -Rpt <!> quot; [BackupArchive] \ BackupLog_TRN.txt <!> quot; [RptExpirationSchedule] -BkUpLog <!> quot; [BackupArchive] <!> quot; -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule] ''
使用している実際のコマンドをデータベーステーブル(コマンドごとに1行)に保存し、ある種のテンプレート置換スキームを使用して構成可能な値を処理することをお勧めします。これにより、新しいコードをデプロイする必要なく、コマンドを簡単に変更できます。
復元には、内部SQLサーバー接続を除くすべての接続を強制終了する必要があります。基本的に<!> quot; exec sp_who <!> quot;の結果を取得します。 dbnameで一致し、ステータスが<!> quot; background <!> quot;ではなく、cmdが<!> quot; SIGNAL HANDLER <!> quot;、<! > quot; LOCK MONITOR <!> quot ;, <!> quot; LAZY WRITER <!> quot ;, <!> quot; LOG WRITER <!> quot ;, <!> quot; CHECKPOINT SLEEP <!> quot; <!> quot; kill <!> quot; spidで(例:ExecuteNonQuery(<!> quot; kill 1283 <!> quot;))。
KILLコマンドからの例外をトラップして無視します。それらについてできることは何もありません。既存の接続が原因で復元を続行できない場合、エラーが発生します。
接続を強制終了する場合の危険の1つは、ADOの接続プールです(Windowsアプリよりもasp.netアプリの方が多い)。 ADOは、接続プールからフェッチされた接続が有効であると想定します...そして、強制終了された接続にはうまく反応しません。その接続で発生する次の操作は失敗します。エラーを思い出せません...その特定のエラーだけをトラップして処理できるかもしれません... 3.5でも、接続プールをフラッシュできると思います(したがって...エラーをトラップし、接続プールをフラッシュします、接続を開き、コマンドを再試行してください... lyいですが、実行可能かもしれません。