已解决问题
谷歌cibei101用户在2015.06.21提交了关于“英达什么是**库的分离,附加,备份,还原”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-08-28T12:54:20。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
详细问题描述及疑问:期待您的答案,千言万语,表达不了我的感激之情,我已铭记在心 !
1.在用户的配置时
取得**库服务器列表:
publi
{
ArrayListalServers=newA
SQLDMO.ApplicationsqlApp=newSQLDMO.A
try
{
SQLDMO.NameListserve
for(inti=1;i<=serverList
{
alServers.Add(s
}
}
catch(Except
{
throw(newExce
}
finall
{
sqlApp.Quit();
}
returnalServers;
}
publicA
{
ServerName=strServe
UserName=strU
Passwo
ArrayListalDbs=newArra
SQLDMO.ApplicationsqlApp=newSQLDMO.Applicat
SQLDMO.SQLServ
try
{
svr.Connect(ServerName,UserN
foreach(SQLDMO.Databasedb
{
if(***.Name!=**ll)
alDbs.Add(*
}
}
ca
{
throw(newExcept
}
finally
{
svr
sqlApp.Qu
}
returnalDbs;
}
2.**库的备份和实时进度显示代码:
publicboolBackUPDB(stringstr
{
PBar=
SQLDMO.SQ
try
{
svr.Connect(ServerName,UserName,Password);
SQLDMO.Backupb**=newSQLDMO.BackupClass();
b**.Act
b**.Initialize=true;
S
b**.
b**.Files=strFileName;
b**.Database=str
ba
return
}
catch(Exceptionerr)
{
throw(newExcep
}
finally
{
svr.DisConnect();
}
}
privatevoidStep(stringmessage,intpercent)
{
PBar.Value=percent;
}
其中,这两个语句实现了进度的实时显示:
SQLDMO.BackupSink_PercentCompleteEventh**andlerpceh=newSQLDMO.BackupSink_PercentCompleteEventh**andler(Step);
b**.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.E**mProcesses(-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)
bre**;
}
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_PercentCompleteEventh**andlerpceh=newSQLDMO.RestoreSink_PercentCompleteEventh**andler(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.E**mProcesses(-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)
bre**;
}
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);
}