前回、データベースの復元と回復を伴うプロジェクトに取り組みました。オンラインで検索したところ、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)
using
System;
using System.Configuration;
using System.Data.SqlClient;
using
System.Data
;
<summary >
///DbOper
クラス
は
、主に SQLDMO を使用
し
て Microsoft SQL Server データベースのバックアップとリカバリを実装
し
ます
。
string conn ;
/// <summary>
/// DbOper クラスのコンストラクター
///
</summary>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
( conn,"server=",";");
uid=cut(conn,"uid=",";");
pwd=
cut(conn,"pwd=",";");
, "database=",";");
}
パブリック文字列カット(文字列str,文字列bg,文字列ed)
{
文字
列
sub=str.Substring(str.IndexOf(bg)+bg.Length);
. サブ文字列(0,sub.IndexOf(";")
)
;
/// <summary>
/// データベースのバックアップ
/// </summary>
public bool DbBackup(string url)
{
SQLDMO.Backup oBackup = new
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(server,uid, pwd);
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Files
= url;//"d:Northwind.bak ";
oBackup.BackupSetName = データベース;
oBackup.BackupSetDescription = "データベース バックアップ";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
return true;
}
catch
{
return false;
throw;
}
finally
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// データベースの回復
/// </summary>
public string DbRestore(string url)
{
if(exepro()!=true)//ストアド プロシージャを実行
{
return "操作が失敗しました"
}
else
{
SQLDMO.Restore oRestore = new SQLDMO.SQLServer
oSQLServer
= new SQLDMO.SQLServerClass();
oSQLServer.LoginSecure = false
;
oRestore.Action
= SQLDMO.SQLDMO_RESTORE_TYPE .SQLDMORestore_Database;
oRestore.Files
= url;//@"d:Northwind.bak";
oRestore.ReplaceDatabase
=
true
;
;
}
catch(Exception e)
{
return "データベースの復元に失敗しました";
}
finally
{
oSQLServer.DisConnect
()
}
}
}
private bool 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 " ,"ポート");
try
{
conn1.Open();
cmd.ExecuteNonQuery();
return true;
}
catch(Exception ex)
{
return false;
}
finally
{
conn1.Close();
}
}
}
}