前回、データベースの復元と回復を伴うプロジェクトに取り組みました。オンラインで検索したところ、SQLDMO 参照を追加し、次のクラスのメソッドを使用するだけで実装できることがわかりました。
元の作成者のクラスを拡張して、web.config 内のデータベース接続文字列を自動的に認識し、変数設定を通じて回復された情報を復元できるようにしました。
復元するときに注意する必要があるのは、他のユーザーがデータベースを使用している場合、その解決策は MASTER データベースにストアド プロシージャを追加することです。
proc killspid を作成します (@dbname varchar(20))
として
始める
@sql nvarchar(500) を宣言します
@spid int を宣言する
set @sql='getspid カーソルを宣言します
dbid=db_id( '''+@dbname+''')'の sysprocesses から spid を選択します
実行(@sql)
getpidを開く
getspid から @spid に次をフェッチします
while @@fetch_status<>-1
始める
exec('kill '+@spid )
getspid から @spid に次をフェッチします
終わり
取得IDを閉じる
getpid の割り当てを解除する
終わり
行く
復元する前にこのストアド プロシージャを実行するには、データベースの名前である dbname を渡す必要があります。以下はクラスの元のコードです: (web.config のデータベース接続文字列は constr です)
システムを使用する;
System.Configuration を使用します。
System.Data.SqlClient を使用します。
System.Data を使用します。
名前空間 web.base_class
{
/// <概要>
/// DbOper クラス。主に SQLDMO を使用して Microsoft SQL Server データベースのバックアップとリカバリを実現します。
/// 概要>
パブリック クラス DbOper
{
プライベート文字列サーバー。
プライベート文字列uid;
プライベート文字列 pwd;
プライベート文字列データベース。
プライベート文字列 conn;
/// <概要>
/// DbOper クラスのコンストラクター
/// 概要>
パブリック DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
サーバー=カット(conn,"サーバー=",";");
uid=cut(conn,"uid=",";");
pwd=cut(conn,"pwd=",";");
データベース=カット(conn,"データベース=",";");
}
パブリック文字列カット(文字列 str,文字列 bg,文字列 ed)
{
文字列サブ;
sub=str.Substring(str.IndexOf(bg)+bg.Length);
sub=sub.Substring(0,sub.IndexOf(";"));
サブを返します。
}
/// <概要>
/// データベースのバックアップ
/// 概要>
public bool DbBackup(文字列 URL)
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
試す
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(サーバー,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = データベース;
oBackup.Files = url;//"d:Northwind.bak";
oBackup.BackupSetName = データベース;
oBackup.BackupSetDescription = "データベースのバックアップ";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
true を返します。
}
キャッチ
{
false を返します。
投げる;
}
ついに
{
oSQLServer.DisConnect();
}
}
/// <概要>
/// データベースのリカバリ
/// 概要>
パブリック文字列 DbRestore(文字列 URL)
{
if(exepro()!=true)//ストアドプロシージャを実行する
{
「操作が失敗しました」を返します。
}
それ以外
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
試す
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(サーバー、uid、pwd);
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = データベース;
oRestore.Files = url;//@"d:Northwind.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
「OK」を返します。
}
catch(例外 e)
{
「データベースの復元に失敗しました」を返します。
投げる;
}
ついに
{
oSQLServer.DisConnect();
}
}
}
プライベートブールexepro()
{
SqlConnection conn1 = new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
SqlCommand cmd = new SqlCommand("killspid",conn1);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@dbname","ポート");
試す
{
conn1.Open();
cmd.ExecuteNonQuery();
true を返します。
}
catch(例外例)
{
false を返します。
}
ついに
{
conn1.Close();
}
}
}
}