C#数据库备份及还原

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

取得数据库服务器列表:

  1. public ArrayList GetServerList()
  2. {
  3. ArrayList alServers = new ArrayList() ;
  4. SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
  5. try
  6. {
  7. SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ;
  8. for(int i = 1;i<= serverList.Count;i++)
  9. {
  10. alServers.Add(serverList.Item(i)) ;
  11. }
  12. }
  13. catch(Exception e)
  14. {
  15. throw(new Exception("取数据库服务器列表出错:"+e.Message)) ;
  16. }
  17. finally
  18. {
  19. sqlApp.Quit() ;
  20. }
  21. return alServers ;
  22. }
 
取得指定数据库服务器的数据库列表   
  1. public ArrayList GetDbList(string strServerName,string strUserName,string strPwd)
  2. {
  3. ServerName = strServerName ;
  4. UserName = strUserName ;
  5. Password = strPwd ;
  6. ArrayList alDbs = new ArrayList() ;
  7. SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
  8. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
  9. try
  10. {
  11. svr.Connect(ServerName,UserName,Password) ;
  12. foreach(SQLDMO.Database db in svr.Databases)
  13. {
  14. if(db.Name!=null)
  15. alDbs.Add(db.Name) ;
  16. }
  17. }
  18. catch(Exception e)
  19. {
  20. throw(new Exception("连接数据库出错:"+e.Message)) ;
  21. }
  22. finally
  23. {
  24. svr.DisConnect() ;
  25. sqlApp.Quit() ;
  26. }
  27. return alDbs ;
  28. }
 

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

  1. public bool BackUPDB(string strDbName,string strFileName, ProgressBar pgbMain)
  2. {
  3. PBar = pgbMain ;
  4. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
  5. try
  6. {
  7. svr.Connect(ServerName,UserName,Password) ;
  8. SQLDMO.Backup bak = new SQLDMO.BackupClass();
  9. bak.Action =  ;
  10. bak.Initialize = true ;
  11. SQLDMO.BackupSink_PercentCompleteEventHandler pceh =
  12. new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
  13. bak.PercentComplete += pceh;
  14. bak.Files = strFileName;
  15. bak.Database = strDbName;
  16. bak.SQLBackup(svr);
  17. return true ;
  18. }
  19. catch(Exception err)
  20. {
  21. throw(new Exception("备份数据库失败"+err.Message)) ;
  22. }
  23. finally
  24. {
  25. svr.DisConnect() ;
  26. }
  27. }
  28. private void Step(string message,int percent)
  29. {
  30. PBar.Value = percent ;
  31. }

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

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

Step就是上面private void Step(string message,int percent) 的方法名称,它用来显示进度条的当前进度。

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

  1. public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain)
  2. {
  3. PBar = pgbMain ;
  4. SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
  5. try
  6. {
  7. svr.Connect(ServerName,UserName,Password) ;
  8. SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
  9. int iColPIDNum = -1 ;
  10. int iColDbName = -1 ;
  11. for(int i=1;i<=qr.Columns;i++)
  12. {
  13. string strName = qr.get_ColumnName(i) ;
  14. if (strName.ToUpper().Trim() == "SPID")
  15. {
  16. iColPIDNum = i ;
  17. }
  18. else if (strName.ToUpper().Trim() == "DBNAME")
  19. {
  20. iColDbName = i ;
  21. }
  22. if (iColPIDNum != -1 && iColDbName != -1)
  23. break ;
  24. }
  25. for(int i=1;i<=qr.Rows;i++)
  26. {
  27. int lPID = qr.GetColumnLong(i,iColPIDNum) ;
  28. string strDBName = qr.GetColumnString(i,iColDbName) ;
  29. if (strDBName.ToUpper() == strDbName.ToUpper())
  30. svr.KillProcess(lPID) ;
  31. }
  32. SQLDMO.Restore res = new SQLDMO.RestoreClass() ;
  33. res.Action = 0 ;
  34. SQLDMO.RestoreSink_PercentCompleteEventHandler pceh =
  35. new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
  36. res.PercentComplete += pceh;
  37. res.Files = strFileName ;
  38. res.Database = strDbName ;
  39. res.ReplaceDatabase = true ;
  40. res.SQLRestore(svr) ;
  41. return true ;
  42. }
  43. catch(Exception err)
  44. {
  45. throw(new Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message)) ;
  46. }
  47. finally
  48. {
  49. svr.DisConnect() ;
  50. }
  51. }

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

SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;

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

  1. int iColPIDNum = -1 ;
  2. int iColDbName = -1 ;
  3. for(int i=1;i<=qr.Columns;i++)
  4. {
  5. string strName = qr.get_ColumnName(i) ;
  6. if (strName.ToUpper().Trim() == "SPID")
  7. {
  8. iColPIDNum = i ;
  9. }
  10. else if (strName.ToUpper().Trim() == "DBNAME")
  11. {
  12. iColDbName = i ;
  13. }
  14. if (iColPIDNum != -1 && iColDbName != -1)
  15. break ;
  16. }
  17. for(int i=1;i<=qr.Rows;i++)
  18. {
  19. int lPID = qr.GetColumnLong(i,iColPIDNum) ;
  20. string strDBName = qr.GetColumnString(i,iColDbName) ;
  21. if (strDBName.ToUpper() == strDbName.ToUpper())
  22. svr.KillProcess(lPID) ;
  23. }

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

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

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

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

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

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

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

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

  

  到现在我依然不知道是怎么回事,因为我自己创建的数据库再还原是好使的。怎么会这样?一个意外让我发现原来我建的数据库是在数据库实例默认的路径下,而真实数据库备份文件则不是,它的路径是客户机器上的,肯定不一样。为了验证这个发现,我做了如下的工作。

第一步:创建数据库,create database TestDb 。

第二步:备份数据库。

第三步:直接还原数据库,restore database RestoreDbName from disk ='I:\TestDatabase'  ,执行成功。

第四步:还原数据库,这时候我不是采用默认还原,而是将数据库还原到系统的另一个路径下,代码如下:

restore database RestoreDbName from disk ='I:\TestDatabase'   with  replace, move 'TestDb' to 'H:\DBFolder\RestoreDbName_Data.mdf', move 'TestDb_log' to 'H:\DBFolder\RestoreDbName_Log.ldf'

执行结果:

  第五步:再次备份数据库RestoreDbName。备份后我们用 filelistonly 可以看到当前数据库备份文件的备份路径( restore filelistonly from disk = 'I:\RestoreDb' ), 执行后结果如下:

  从这里我们可以看到当前数据库备份文件的真实物理路径。

第六步:当我再次执行 restore database RestoreDbName from disk ='I:\RestoreDb' ,执行错误。出现了和真实环境一样的错误。原来如上文所述那样,数据库备份文件在还原时,如果当前数据库实例的默认路径和数据库备份文件不相符时需要通过move来解决,而不能单纯的 Restore。

于是我又重新写了一下数据库备份文件还原的相关方法,如下所示。通过这个方法就能简单的实现数据库备份文件还原了。

 /// <summary>
/// 还原数据库文件
/// </summary>
/// <param name="basePath">电子账簿所在根目录</param>
/// <param name="fileName">数据库备份文件名称</param>
/// <param name="databaseName">需要还原的数据库名称</param>
/// <param name="conn">数据库连接</param>
private bool RestoreDataBase(string basePath, string fileName, string databaseName, SqlConnection conn)
{
SqlCommand command = null;
try
{
string restoreStr = string.Empty;
string getLogicFileName = string.Format("restore filelistonly from disk ='{0}'", Path.Combine(basePath, fileName));
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(getLogicFileName, conn);
da.Fill(ds);
if (ds.Tables == null || ds.Tables[0].Rows.Count == 0) return false; foreach (DataRow dr in ds.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");
//查找数据库日志文件名称
else if ("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("restore database {0} from disk ='{1}'", databaseName, Path.Combine(basePath, fileName));
else
{
restoreStr = string.Format("restore database {0} from disk ='{1}' with replace,", databaseName, Path.Combine(basePath, fileName)) + restoreStr.TrimEnd(',');
}
command = new SqlCommand(restoreStr, conn);
conn.Open();
command.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
conn.Close();
}
}
/// <summary>
/// 还原数据库文件
/// </summary>
/// <param name="basePath">电子账簿所在根目录</param>
/// <param name="fileName">数据库备份文件名称</param>
/// <param name="databaseName">需要还原的数据库名称</param>
/// <param name="conn">数据库连接</param>
private bool RestoreDataBase(string basePath, string fileName, string databaseName, SqlConnection conn)
{
SqlCommand command = null;
try
{
string restoreStr = string.Empty;
string getLogicFileName = string.Format("restore filelistonly from disk ='{0}'", Path.Combine(basePath, fileName));
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(getLogicFileName, conn);
da.Fill(ds);
if (ds.Tables == null || ds.Tables[0].Rows.Count == 0) return false; foreach (DataRow dr in ds.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");
//查找数据库日志文件名称
else if ("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("restore database {0} from disk ='{1}'", databaseName, Path.Combine(basePath, fileName));
else
{
restoreStr = string.Format("restore database {0} from disk ='{1}' with replace,", databaseName, Path.Combine(basePath, fileName)) + restoreStr.TrimEnd(',');
}
command = new SqlCommand(restoreStr, conn);
conn.Open();
command.ExecuteNonQuery();
return true;
}
catch (Exception ex)
{
return false;
}
finally
{
conn.Close();
}
}

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

  1. python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...

  2. SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?

    什么是数据库? 为什么需要数据库? 是不是所有的软件都是用Sql Server? 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Exp ...

  3. 功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

    软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数 ...

  4. PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库

    课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全称是Microsoft SQL Server,MSSQL是简写,有些人则喜欢直接叫SQL Server,我就比较 ...

  5. 【转发】PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库

    转发自:http://blog.csdn.net/lccee/article/details/54289076 课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全 ...

  6. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库

    目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...

  7. 数据库批量修改表名,增加前缀(SQL server)

    exec sp_msforeachtable @command1=' declare @o sysname,@n sysname select @o=''?'' ,@n=stuff(@o,1,7,'' ...

  8. Sql Server 备份还原失败错误ERROR:3145(备份集中的数据库备份与现有的数据库不同)及解决办法

    SQL Server备份文件bak,备份后还原出现错误3145,备份集中的数据库备份与现有的 'xxx' 数据库不同. 解决办法如下: 1,新建一个与现有数据库重名的数据库. 如果您不知道数据库名称, ...

  9. 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...

随机推荐

  1. html5——多媒体(四)

    全屏兼容 box.requestFullscreen(); box.webkitRequestFullScreen(); box.mozRequestFullScreen(); <!DOCTYP ...

  2. jQuery——类的添加与删除

    添加类:addClass 删除类:removeClass 判断类是否存在:hasClass <!DOCTYPE html> <html lang="en"> ...

  3. HDU_1087_Super Jumping! Jumping! Jumping!_dp

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. C/C++ 之数组排序

    #include <stdio.h> #include <stdlib.h> void array_sort(int *a, int len) { int i, j, tmp; ...

  5. 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

    如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1≤n≤100000),求最小 生成元.无解输出0.例如,n=216,121,2005时的解分别为198,0,1979. [分析] 本题看 ...

  6. Spring MVC 笔记 概述

    学习笔记 模型:封装装程序数据 视图:渲染模型数据,一般来说就是输出HTML 控制:处理请求,构建模型并将其传递给视图进行渲染 以上三者均围绕DispatcherServlet设计,它处理所有的HTT ...

  7. python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

    快 快了 啊 嘿 小老弟 想啥呢 今天这篇爬虫教程的主题就是一个字 快 想要做到秒爬 就需要知道 什么是多进程 什么是多线程 什么是协程(微线程) 你先去沏杯茶 坐下来 小帅b这就好好给你说道说道 关 ...

  8. Python 元组和列表

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...

  9. BZOJ 1572 USACO 2009 Open 工作安排

    先把工作按照Deadline从小到大排序 然后按顺序取,deadline大于现在总用时就取,等于现在总用时就从前面已取的工作中找一个P最小的同它比较,取P较大的一个 用优先队列维护已取工作中P的最小值 ...

  10. 【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)

    [题目链接]:http://hihocoder.com/contest/offers13/problem/2 [题意] [题解] 算出1..250*250这些数字每个数字的所有因子(成对的那种,即x* ...