您的位置:首页 > 数据库

C#备份及还原数据库的实现

2013-06-28 16:38 302 查看
使用前要导入SQLDMO.dll

下载地址:http://down.51cto.com/data/853937

1.在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所有数据库,实现代码如下:

取得数据库服务器列表:



publicArrayListGetServerList()

{

ArrayListalServers=newArrayList();

SQLDMO.ApplicationsqlApp=newSQLDMO.ApplicationClass();

try

{

SQLDMO.NameListserverList=sqlApp.ListAvailableSQLServers();

for(inti=1;i<=serverList.Count;i++)

{

alServers.Add(serverList.Item(i));

}

}

catch(Exceptione)

{

throw(newException("取数据库服务器列表出错:"+e.Message));

}

finally

{

sqlApp.Quit();

}

returnalServers;

}

取得指定数据库服务器的数据库列表



publicArrayListGetDbList(stringstrServerName,stringstrUserName,stringstrPwd)

{

ServerName=strServerName;

UserName=strUserName;

Password=strPwd;

ArrayListalDbs=newArrayList();

SQLDMO.ApplicationsqlApp=newSQLDMO.ApplicationClass();

SQLDMO.SQLServersvr=newSQLDMO.SQLServerClass();

try

{

svr.Connect(ServerName,UserName,Password);

foreach(SQLDMO.Databasedbinsvr.Databases)

{

if(db.Name!=null)

alDbs.Add(db.Name);

}

}

catch(Exceptione)

{

throw(newException("连接数据库出错:"+e.Message));

}

finally

{

svr.DisConnect();

sqlApp.Quit();

}

returnalDbs;

}


2.数据库的备份和实时进度显示代码:



publicboolBackUPDB(stringstrDbName,stringstrFileName,ProgressBarpgbMain)

{

PBar=pgbMain;

SQLDMO.SQLServersvr=newSQLDMO.SQLServerClass();

try

{

svr.Connect(ServerName,UserName,Password);

SQLDMO.Backupbak=newSQLDMO.BackupClass();

bak.Action=0;

bak.Initialize=true;

SQLDMO.BackupSink_PercentCompleteEventHandlerpceh=

newSQLDMO.BackupSink_PercentCompleteEventHandler(Step);

bak.PercentComplete+=pceh;

bak.Files=strFileName;

bak.Database=strDbName;

bak.SQLBackup(svr);

returntrue;

}

catch(Exceptionerr)

{

throw(newException("备份数据库失败"+err.Message));

}

finally

{

svr.DisConnect();

}

}

privatevoidStep(stringmessage,intpercent)

{

PBar.Value=percent;

}


其中,这两个语句实现了进度的实时显示:

SQLDMO.BackupSink_PercentCompleteEventHandlerpceh=newSQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete+=pceh;

Step就是上面privatevoidStep(stringmessage,intpercent)的方法名称,它用来显示进度条的当前进度。

3.数据库的恢复和杀死进程的代码:



publicboolRestoreDB(stringstrDbName,stringstrFileName,ProgressBarpgbMain)

{

PBar=pgbMain;

SQLDMO.SQLServersvr=newSQLDMO.SQLServerClass();

try

{

svr.Connect(ServerName,UserName,Password);

SQLDMO.QueryResultsqr=svr.EnumProcesses(-1);

intiColPIDNum=-1;

intiColDbName=-1;

for(inti=1;i<=qr.Columns;i++)

{

stringstrName=qr.get_ColumnName(i);

if(strName.ToUpper().Trim()=="SPID")

{

iColPIDNum=i;

}

elseif(strName.ToUpper().Trim()=="DBNAME")

{

iColDbName=i;

}

if(iColPIDNum!=-1&&iColDbName!=-1)

break;

}

for(inti=1;i<=qr.Rows;i++)

{

intlPID=qr.GetColumnLong(i,iColPIDNum);

stringstrDBName=qr.GetColumnString(i,iColDbName);

if(strDBName.ToUpper()==strDbName.ToUpper())

svr.KillProcess(lPID);

}

SQLDMO.Restoreres=newSQLDMO.RestoreClass();

res.Action=0;

SQLDMO.RestoreSink_PercentCompleteEventHandlerpceh=

newSQLDMO.RestoreSink_PercentCompleteEventHandler(Step);

res.PercentComplete+=pceh;

res.Files=strFileName;

res.Database=strDbName;

res.ReplaceDatabase=true;

res.SQLRestore(svr);

returntrue;

}

catch(Exceptionerr)

{

throw(newException("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message));

}

finally

{

svr.DisConnect();

}

}


其中这个语句取得了所有的进程列表:

SQLDMO.QueryResultsqr=svr.EnumProcesses(-1);

下面的语句找到和要恢复数据库相关的进程并杀死:



intiColPIDNum=-1;

intiColDbName=-1;

for(inti=1;i<=qr.Columns;i++)

{

stringstrName=qr.get_ColumnName(i);

if(strName.ToUpper().Trim()=="SPID")

{

iColPIDNum=i;

}

elseif(strName.ToUpper().Trim()=="DBNAME")

{

iColDbName=i;

}

if(iColPIDNum!=-1&&iColDbName!=-1)

break;

}

for(inti=1;i<=qr.Rows;i++)

{

intlPID=qr.GetColumnLong(i,iColPIDNum);

stringstrDBName=qr.GetColumnString(i,iColDbName);

if(strDBName.ToUpper()==strDbName.ToUpper())

svr.KillProcess(lPID);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: