C#备份及还原数据库的实现代码(粗略) // 利用C#还原数据库(SQL SERVER)备份文件到指定路径
C#数据库备份及还原
1.在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所有数据库,实现代码如下:
取得数据库服务器列表:
- public ArrayList GetServerList()
- {
- ArrayList alServers = new ArrayList() ;
- SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
- try
- {
- SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers() ;
- for(int i = 1;i<= serverList.Count;i++)
- {
- alServers.Add(serverList.Item(i)) ;
- }
- }
- catch(Exception e)
- {
- throw(new Exception("取数据库服务器列表出错:"+e.Message)) ;
- }
- finally
- {
- sqlApp.Quit() ;
- }
- return alServers ;
- }
取得指定数据库服务器的数据库列表
- public ArrayList GetDbList(string strServerName,string strUserName,string strPwd)
- {
- ServerName = strServerName ;
- UserName = strUserName ;
- Password = strPwd ;
- ArrayList alDbs = new ArrayList() ;
- SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass() ;
- SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
- try
- {
- svr.Connect(ServerName,UserName,Password) ;
- foreach(SQLDMO.Database db in svr.Databases)
- {
- if(db.Name!=null)
- alDbs.Add(db.Name) ;
- }
- }
- catch(Exception e)
- {
- throw(new Exception("连接数据库出错:"+e.Message)) ;
- }
- finally
- {
- svr.DisConnect() ;
- sqlApp.Quit() ;
- }
- return alDbs ;
- }
2.数据库的备份和实时进度显示代码:
- public bool BackUPDB(string strDbName,string strFileName, ProgressBar pgbMain)
- {
- PBar = pgbMain ;
- SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
- try
- {
- svr.Connect(ServerName,UserName,Password) ;
- SQLDMO.Backup bak = new SQLDMO.BackupClass();
- bak.Action = ;
- bak.Initialize = true ;
- SQLDMO.BackupSink_PercentCompleteEventHandler pceh =
- new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
- bak.PercentComplete += pceh;
- bak.Files = strFileName;
- bak.Database = strDbName;
- bak.SQLBackup(svr);
- return true ;
- }
- catch(Exception err)
- {
- throw(new Exception("备份数据库失败"+err.Message)) ;
- }
- finally
- {
- svr.DisConnect() ;
- }
- }
- private void Step(string message,int percent)
- {
- PBar.Value = percent ;
- }
其中,这两个语句实现了进度的实时显示:
SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
bak.PercentComplete += pceh;
Step就是上面private void Step(string message,int percent) 的方法名称,它用来显示进度条的当前进度。
3.数据库的恢复和杀死进程的代码:
- public bool RestoreDB(string strDbName,string strFileName, ProgressBar pgbMain)
- {
- PBar = pgbMain ;
- SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass() ;
- try
- {
- svr.Connect(ServerName,UserName,Password) ;
- SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
- int iColPIDNum = -1 ;
- int iColDbName = -1 ;
- for(int i=1;i<=qr.Columns;i++)
- {
- string strName = qr.get_ColumnName(i) ;
- if (strName.ToUpper().Trim() == "SPID")
- {
- iColPIDNum = i ;
- }
- else if (strName.ToUpper().Trim() == "DBNAME")
- {
- iColDbName = i ;
- }
- if (iColPIDNum != -1 && iColDbName != -1)
- break ;
- }
- for(int i=1;i<=qr.Rows;i++)
- {
- int lPID = qr.GetColumnLong(i,iColPIDNum) ;
- string strDBName = qr.GetColumnString(i,iColDbName) ;
- if (strDBName.ToUpper() == strDbName.ToUpper())
- svr.KillProcess(lPID) ;
- }
- SQLDMO.Restore res = new SQLDMO.RestoreClass() ;
- res.Action = 0 ;
- SQLDMO.RestoreSink_PercentCompleteEventHandler pceh =
- new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
- res.PercentComplete += pceh;
- res.Files = strFileName ;
- res.Database = strDbName ;
- res.ReplaceDatabase = true ;
- res.SQLRestore(svr) ;
- return true ;
- }
- catch(Exception err)
- {
- throw(new Exception("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message)) ;
- }
- finally
- {
- svr.DisConnect() ;
- }
- }
其中这个语句取得了所有的进程列表:
SQLDMO.QueryResults qr = svr.EnumProcesses(-1) ;
下面的语句找到和要恢复数据库相关的进程并杀死:
- int iColPIDNum = -1 ;
- int iColDbName = -1 ;
- for(int i=1;i<=qr.Columns;i++)
- {
- string strName = qr.get_ColumnName(i) ;
- if (strName.ToUpper().Trim() == "SPID")
- {
- iColPIDNum = i ;
- }
- else if (strName.ToUpper().Trim() == "DBNAME")
- {
- iColDbName = i ;
- }
- if (iColPIDNum != -1 && iColDbName != -1)
- break ;
- }
- for(int i=1;i<=qr.Rows;i++)
- {
- int lPID = qr.GetColumnLong(i,iColPIDNum) ;
- string strDBName = qr.GetColumnString(i,iColDbName) ;
- if (strDBName.ToUpper() == strDbName.ToUpper())
- svr.KillProcess(lPID) ;
- }
C#数据库备份及还原就介绍到这里,希望对你有所帮助。
/////////////////////////////////////////////////////
利用C#还原数据库(SQL SERVER)备份文件到指定路径
利用C#还原数据库(SQL SERVER)备份文件到指定路径
2012-2-19 08:58| 发布者: benben| 查看: 1938| 评论: 0
|
最近在做一个数据采集模块,遇到这样一个场景,就是需要将数据库备份文件还原到指定数据库实例下再采集数据。本机测试都没有问题,可一拿到真实环境中测试却发现了一个很大的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> |
C#备份及还原数据库的实现代码(粗略) // 利用C#还原数据库(SQL SERVER)备份文件到指定路径的更多相关文章
- python:利用pymssql模块操作SQL server数据库
python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...
- SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?
什么是数据库? 为什么需要数据库? 是不是所有的软件都是用Sql Server? 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Exp ...
- 功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上
软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数 ...
- PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全称是Microsoft SQL Server,MSSQL是简写,有些人则喜欢直接叫SQL Server,我就比较 ...
- 【转发】PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
转发自:http://blog.csdn.net/lccee/article/details/54289076 课前小知识普及:MSSQL和SQL Server是同一个软件,叫法不同而已,MSSQL全 ...
- 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库
目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...
- 数据库批量修改表名,增加前缀(SQL server)
exec sp_msforeachtable @command1=' declare @o sysname,@n sysname select @o=''?'' ,@n=stuff(@o,1,7,'' ...
- Sql Server 备份还原失败错误ERROR:3145(备份集中的数据库备份与现有的数据库不同)及解决办法
SQL Server备份文件bak,备份后还原出现错误3145,备份集中的数据库备份与现有的 'xxx' 数据库不同. 解决办法如下: 1,新建一个与现有数据库重名的数据库. 如果您不知道数据库名称, ...
- 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加
认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...
随机推荐
- 2015.12.25-2016.01.01 大论文迭代B
大论文B轮迭代,稍重前端 12.25 周五,完善摘要 12.26 周六,完善第一章 12.27 周天,完善第二章 12.28 周一,完善第三章 12.29 周二,完善第四章 12.30 周三,完善第五 ...
- 使用CSS3实现表格隔行/隔列变色
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title> ...
- 293. [NOI2000] 单词查找树——COGS
293. [NOI2000] 单词查找树 ★★ 输入文件:trie.in 输出文件:trie.out 简单对比时间限制:1 s 内存限制:128 MB 在进行文法分析的时候,通常需要检 ...
- 踪电子表格中的单元格(Spreadsheet Tracking, ACM/ICPC World Finals 1997, UVa512)
有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1-r,列从左到右编号为1 -c.如图4-2(a)所示,如果先删除第1.5行,然后删除第3, 6, 7, 9列,结果如图4-2(b) 所示 ...
- vim使用配置-python
安装vundle git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 添加配置文件 vim ~/.v ...
- JAVA学习总结-基础语法
/** * 这篇文章供自己学习JAVA总结回顾使用 * 主要借鉴了马士兵老师的视频进行总结 * @author Kingram */ 标识符的概念和命名规则 JAVA常量---不可变的变量 程序的执行 ...
- elisp 编程 if 特殊表
elisp中的 if 特殊表与其他语言中的 if 语句逻辑上并无二致,关键在于如何使用. (if (> 4 3) (message "4 is greater than 3" ...
- poj 1273最大流dinic算法模板
#include<stdio.h> #include<string.h> #define N 300 #define inf 0x7fffffff #include<qu ...
- sublime3设置快捷键在浏览器打开预览
我下的st3默认不能使用快捷键在浏览器打开,所以要找到源文件然后选择在浏览器打开,非常麻烦.找了很久,终于找到了一个在浏览器打开的快捷方式. 亲测有效. 1.确保你的st3已经安装了package c ...
- N天学习一个linux命令之ping
用途 检测主机是否可到达,也就是说,目标主机是否可以联网,还可以用于检测网速.通过发送ICMP ECHO_REQUEST数据包检测. 用法 ping [options] destination 常用选 ...

