0

I am developing a small business application which uses Sqlserver 2005 database.

Platform: .Net framework 3.5; Application type: windows application; Language: C#

Question:

I need to take and restore the backup from my application. I have the required script generated from SSME.

How do I run that particular script (or scripts) from my winform application?

4

5 に答える 5

1

これらのスクリプトは、クエリを実行するのと同じ方法で実行できます。ただし、復元するデータベースに接続するのではなく、代わりに master に接続します。

于 2009-01-10T14:37:00.193 に答える
0

データベースへの接続 (ADO だと思いますか?) を使用し、この接続を介して単純な TSQL 命令をサーバーに送信するだけです。

于 2009-01-10T15:04:53.443 に答える
0

アプリケーションが実行されているマシンに SQL Server クライアント ツールがインストールされている場合は、sqlcmdを使用できます。

于 2009-01-10T14:37:46.167 に答える
0

プログラムで実行したい場合は、SMOを使用できます。

チュートリアル

于 2009-01-10T14:46:48.830 に答える
0

バックアップには、おそらく xp_sqlmaint を使用する必要があります。古いバックアップを削除する便利な機能があり、適切なログ ファイルが作成されます。次のような方法で呼び出すことができます。 "[BackupArchive]" -BkUpMedia DISK [BakExpirationSchedule]''

([角括弧] を適切な値に置き換えます)。

また、バックアップのために、トランザクション ログのバックアップが必要になる場合があります。次のようなもの: IF DATABASEPROPERTYEX((SELECT db_name(dbid) FROM master..sysprocesses WHERE spid=@@SPID), ''Recovery'') <> ''SIMPLE'' EXECUTE master.dbo.xp_sqlmaint N'' -S " [ServerName]" [ServerLogonDetails] -D [DatabaseName] -Rpt "[BackupArchive]\BackupLog_TRN.txt" [RptExpirationSchedule] -BkUpLog "[BackupArchive]" -BkExt TRN -BkUpMedia DISK [BakExpirationSchedule]''

使用している実際のコマンドをデータベース テーブル (コマンドごとに 1 行) に保存し、何らかのテンプレート置換スキームを使用して構成可能な値を処理することをお勧めします。これにより、新しいコードをデプロイする必要なく、コマンドを簡単に変更できます。

復元するには、内部 SQL サーバー以外のすべての接続を切断する必要があります。基本的に、「exec sp_who」の結果と、dbname で一致し、ステータスが「background」ではない行、および「SIGNAL HANDLER」、「LOCK MONITOR」、「LAZY WRITER」のいずれでもない cmd を取得します。 、「LOG WRITER」、「CHECKPOINT SLEEP」は、spid を「kill」します (例: ExecuteNonQuery("kill 1283"))。

KILL コマンドからの例外をトラップして無視する必要があります。それらについてあなたができることは何もありません。既存の接続が原因で復元を続行できない場合は、エラーが発生します。

接続を強制終了する際の危険の 1 つは、ADO の接続プールです (Windows アプリよりも asp.net アプリの方が多い)。ADO は、接続プールからフェッチされた接続が有効であると想定します...そして、強制終了された接続にはうまく反応しません。その接続で発生する次の操作は失敗します。エラーを思い出せません...その特定のエラーだけをトラップして処理できるかもしれません...また、3.5でも接続プールをフラッシュできると思います(したがって...エラーをトラップし、接続プールをフラッシュします、接続を開き、コマンドを再試行してください...醜いですが、実行できる可能性があります)。

于 2009-01-11T01:46:53.333 に答える