前回、データベースの復元と回復を伴うプロジェクトに取り組みました。オンラインで検索したところ、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;
namespace web.base_class
{
/// <summary>
/// DbOper クラスは、主に Microsoft SQL Server のバックアップとリカバリを実現します。データベース
/// </summary>
public class DbOper
{
private string
uid
;
/// <summary>
///DbOper
クラスのコンストラク
ター
;
概要>
public DbOper()
{
conn=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
サーバー=cut(conn
,"server=",";");
=",";");
pwd=cut(conn,"pwd=",";");
データベース=カット(conn,"database=",";");
}
public string Cut(string str,string bg ,string ed)
{
文字列
sub=str.Substring(str.IndexOf(
bg)+bg.Length);
sub=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();
}
}
}
}