您的位置:首页 > 数据库

C#备份及还原数据库的实现代码(粗略) // 利用C#还原数据库(SQL SERVER)备份文件到指定路径

2013-09-25 23:05 1076 查看
C#数据库备份及还原

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);

}

C#数据库备份及还原就介绍到这里,希望对你有所帮助。

/////////////////////////////////////////////////////

利用C#还原数据库(SQLSERVER)备份文件到指定路径

利用C#还原数据库(SQLSERVER)备份文件到指定路径

2012-2-1908:58|发布者:benben|查看:1938|评论:0

摘要:  最近在做一个数据采集模块,遇到这样一个场景,就是需要将数据库备份文件还原到指定数据库实例下再采集数据。本机测试都没有问题,可一拿到真实环境中测试却发现了一个很大的Bug。所有的数据库都还原不上,很纠...

  最近在做一个数据采集模块,遇到这样一个场景,就是需要将数据库备份文件还原到指定数据库实例下再采集数据。本机测试都没有问题,可一拿到真实环境中测试却发现了一个很大的Bug。所有的数据库都还原不上,很纠结。因为我本以为SQLSERVER会还原到默认路径下,其实不然。

  当我拿到真实数据库备份文件时,我首先在数据库中运行restoredatabaseRestoreDbNamefromdisk='H:\DBFolder\Db_Back',执行结果如下:

ViewCode

///<summary>
///还原数据库文件
///</summary>
///<paramname="basePath">电子账簿所在根目录</param>
///<paramname="fileName">数据库备份文件名称</param>
///<paramname="databaseName">需要还原的数据库名称</param>
///<paramname="conn">数据库连接</param>
privateboolRestoreDataBase(stringbasePath,stringfileName,stringdatabaseName,SqlConnectionconn)
{
SqlCommandcommand=null;
try
{
stringrestoreStr=string.Empty;
stringgetLogicFileName=string.Format("restorefilelistonlyfromdisk='{0}'",Path.Combine(basePath,fileName));
DataSetds=newDataSet();
SqlDataAdapterda=newSqlDataAdapter(getLogicFileName,conn);
da.Fill(ds);
if(ds.Tables==null||ds.Tables[0].Rows.Count==0)returnfalse;

foreach(DataRowdrinds.Tables[0].Rows)
{
//查找数据库逻辑文件名称
if("D".Equals(dr["Type"].ToString()))
restoreStr+=string.Format("move'{0}'to'{1}',",dr["LogicalName"].ToString(),Path.Combine(basePath,databaseName)+"_Data.mdf");
//查找数据库日志文件名称
elseif("L".Equals(dr["Type"].ToString()))
restoreStr+=string.Format("move'{0}'to'{1}',",dr["LogicalName"].ToString(),Path.Combine(basePath,databaseName)+"_Log.ldf");
}
if(string.IsNullOrEmpty(restoreStr))
restoreStr=string.Format("restoredatabase{0}fromdisk='{1}'",databaseName,Path.Combine(basePath,fileName));
else
{
restoreStr=string.Format("restoredatabase{0}fromdisk='{1}'withreplace,",databaseName,Path.Combine(basePath,fileName))+restoreStr.TrimEnd(',');
}
command=newSqlCommand(restoreStr,conn);
conn.Open();
command.ExecuteNonQuery();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
}
finally
{
conn.Close();
}
}


///<summary>
///还原数据库文件
///</summary>
///<paramname="basePath">电子账簿所在根目录</param>
///<paramname="fileName">数据库备份文件名称</param>
///<paramname="databaseName">需要还原的数据库名称</param>
///<paramname="conn">数据库连接</param>
privateboolRestoreDataBase(stringbasePath,stringfileName,stringdatabaseName,SqlConnectionconn)
{
SqlCommandcommand=null;
try
{
stringrestoreStr=string.Empty;
stringgetLogicFileName=string.Format("restorefilelistonlyfromdisk='{0}'",Path.Combine(basePath,fileName));
DataSetds=newDataSet();
SqlDataAdapterda=newSqlDataAdapter(getLogicFileName,conn);
da.Fill(ds);
if(ds.Tables==null||ds.Tables[0].Rows.Count==0)returnfalse;

foreach(DataRowdrinds.Tables[0].Rows)
{
//查找数据库逻辑文件名称
if("D".Equals(dr["Type"].ToString()))
restoreStr+=string.Format("move'{0}'to'{1}',",dr["LogicalName"].ToString(),Path.Combine(basePath,databaseName)+"_Data.mdf");
//查找数据库日志文件名称
elseif("L".Equals(dr["Type"].ToString()))
restoreStr+=string.Format("move'{0}'to'{1}',",dr["LogicalName"].ToString(),Path.Combine(basePath,databaseName)+"_Log.ldf");
}
if(string.IsNullOrEmpty(restoreStr))
restoreStr=string.Format("restoredatabase{0}fromdisk='{1}'",databaseName,Path.Combine(basePath,fileName));
else
{
restoreStr=string.Format("restoredatabase{0}fromdisk='{1}'withreplace,",databaseName,Path.Combine(basePath,fileName))+restoreStr.TrimEnd(',');
}
command=newSqlCommand(restoreStr,conn);
conn.Open();
command.ExecuteNonQuery();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
}
finally
{
conn.Close();
}
}


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