随笔-55  评论-310  文章-10  trackbacks-4

软件功能:
       SQLSERVER数据库的备份和还原,有日志记录。傻瓜操作,避开了直接对SQLSERVER的操作。

 废话一堆:
     在公司做程序的期间我常常遇到客户不懂怎样备份数据库的问题,恰恰公司的开发语言有PB,DELPHI,C#等,所以公司没有花精力让我们做系统自动备份程序。要维护客户的程序,我们有时就需要得到用户数据库上的数据,但客户基本上都不会做备份操作,这样给我们的维护工作造成许多障碍。(废话真多)。于是,我写了下面这个程序。(功能不强,自己做的玩的哈)
     另外,软件上虽然有公司标志,请不要介意,我并没有将程序提交到公司。


     程序界面:

主要代码段:
 

//数据库的备份和实时进度显示代码:
  public bool BackUPDB(string ServerName,string UserName,string Password,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 = 0 ;
                     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)) ;
                    //return false ;
                   //MessageBox.Show("备份数据库失败"+err.Message);
            }
            finally
           {
                    svr.DisConnect() ;
            }
     }


//数据库的恢复的代码:
  public bool RestoreDB(string ServerName,string UserName,string Password,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)) ;
                   //return false ;
                  //MessageBox.Show("恢复数据库失败,请关闭所有和该数据库连接的程序!"+err.Message);
              }
               finally 
              {
                    svr.DisConnect() ;
               }
      }

帮助界面:



          就是一个简单的程序,界面用了制作不规则窗体的一点东西。主要是调用了SQL自己的东西做的。
          软件下载:/Files/allancandy/Debug.rar    (我懒,没有做安装包:))
          运行环境:自己只在win2000上用过,必要条件是先装.net framework

            希望大家多提意见和建议哈。

posted on 2005-08-23 09:36 杨丹 阅读(6303) 评论(28)  编辑 收藏 所属分类: 胡编乱造(我的软件)

评论:
#1楼  2005-08-23 11:59 | Frank Ye [未注册用户]
Need packaged with SQL Server SDK when deploy.

Not a good method.

Should use SQL statement instead.


  回复  引用    
#2楼  2005-08-23 12:25 | lei.gao [未注册用户]
I think this method is not good!when deploy it,should use
DMO Compenet,this is a dependent!So please imporve this design!
you'd better use SQL stored procedure(include backup/restore statement) to deal with this problem!

  回复  引用    
#3楼 [楼主] 2005-08-23 12:33 | 杨丹      
yes ,my method need DMO Compenet,it's not so good.
Frank Ye and lei.gao can you give me some documents about this?
  回复  引用  查看    
#4楼  2005-08-23 14:22 | 吕震宇      
呀呀,一大堆英文评论!

SQL Server中有BACKUP和restore的命令,可以查联机手册。

另外一个比较讨厌人的地方是如何知道当前有几个用户联到数据库上,否则无法备份。

可以使用命令:

use master
select count(*) from master..sysprocesses where dbid=db_id('DBApp这里是数据库名')

这是我用事件探察器探察到的,SQL Server企业管理器在判断几个人使用数据库时用的命令,应当没有问题。祝楼主好运!
  回复  引用  查看    
#5楼  2005-08-23 17:07 | 沉默天蝎的.net学习汇集      
我晕
我很早就写过这个东西了
呵呵
我使用的是
SQLDMO
跟你的差不了多少
呵呵
没想到。。。。
  回复  引用  查看    
#6楼  2005-08-23 17:09 | 沉默天蝎的.net学习汇集      
附带
我可以告诉你还有一个方法
不需要人家手动填上你的数据库名字
只能让人家选择
呵呵。

  回复  引用  查看    
#7楼  2005-08-24 09:51 | 杨丹      
这个程序我写的也很早,只是我现在才发出来。

“不需要人家手动填上你的数据库名字
只能让人家选择 ”的方法我也知道,
DMO Compenet 里就有。自己没时间写了。

我承认我还有很多东西不懂,但没想到会让你晕过去,实在对不住。抱歉!
  回复  引用  查看    
#8楼  2005-08-24 10:08 | loafer [未注册用户]
老兄,能不能看看源代码?
  回复  引用    
#9楼  2005-08-24 12:01 | 沉默天蝎的.net学习汇集      
hehe
杨丹
我这个晕是没有歧义的
你别误会!!
不过说真的
我对你的界面比较感兴趣
如果你公开源代码
我会下来看看
谢谢!!

  回复  引用  查看    
#10楼 [楼主] 2005-08-24 16:40 | 杨丹      
吕震宇兄的建议很好,我没有考虑当有用户在使用时不能备份的问题。
有时间我会考虑完善程序的,谢谢
  回复  引用  查看    
#11楼  2005-08-31 16:18 | 胡洪祥      
佩服!!!
  回复  引用  查看    
#12楼  2005-08-31 16:53 | talentsharp [未注册用户]
很好!!
  回复  引用    
#13楼  2005-09-02 10:11 | 石头 [未注册用户]
鸟屁哈
  回复  引用    
#14楼  2005-10-05 17:58 | 青蛙 [未注册用户]
在xp中,用户名验证就通不过,不知道怎么会事
  回复  引用    
#15楼  2005-10-30 22:14 | 风也无奈 [未注册用户]
杨丹,你好,我现在在学校读书呢,最近我们老师让我们做一个毕业设计,其中用的到SQL数据库备份的功能, 但小弟不才,没有能力写出来,你能不能把你的源码发给我啊,急用呢,谢谢啊,我的信箱是yujiebo3@sina.com
再次表示感谢!!
  回复  引用    
#16楼 [楼主] 2005-11-03 19:42 | 杨丹      
re:风也无奈
主要代码已经贴出来了。
  回复  引用  查看    
#17楼  2005-12-21 14:25 | 杏子 [未注册用户]
大家好!
有谁可以告诉我一下 
代码里面的Pbar和step 参数是怎么来的吗?>

  回复  引用    
#18楼  2005-12-22 22:21 | 羽蛇 [未注册用户]
丹丹姐,我是学生,期末SQLServer要求交一题编程题,但是老师教的太垃圾,全班一个都不会,期限马上到了,特请教,请把源码发我,谢谢!!!
  回复  引用    
#19楼  2005-12-22 22:22 | 羽蛇 [未注册用户]
项目设计

根据如下需求,设计数据库关系模式(要求定义完整性约束并使该模式符合3NF),并完成相应的DDL/DML操作(SQL语句中可利GetDate()函数获得系统日期)。
1. 某校图书馆管理系统中储存着馆藏书籍、读者及读者借阅书籍的信息。每位读者有一张借书证(证号是唯一的);每本书籍均有一个唯一的书籍序号、并有统一的分类号及关键词;图书馆记录着读者借阅书籍的日期、状态及还书日期;同一位读者不会在同一天重复借阅同一本书籍(书籍序号相同)。
2. 统计该图书馆中数据库类(关键词中为“数据库”)书籍的藏书情况(含书名、分类号、出版社、作者、馆藏数)。
3. 统计已借阅(尚未归还)5本(或以上)书籍的读者的证号、姓名、单位及借阅的册数。
4. 列出所有从未被借阅过的书籍(按分类号计算)的书名、分类号、出版社、作者及馆藏册数。
5. 列出借书证号为‘95001’的读者所借阅过的、书名中含有‘数据库’的图书的书名、分类号、借阅次数,并按借阅次数进行排序(次数多的排列在前)。
6. 在执行借书及还书操作时,对数据库执行哪些操作?请写出这些操作的SQL语句。

  回复  引用    
#20楼  2005-12-22 22:25 | 羽蛇 [未注册用户]
写好后发这个邮箱:janey_hqj@163.com
或发这个QQ:335126718
  回复  引用    
#21楼  2006-02-21 14:36 | ACE [未注册用户]
建议您再多加一些注释,尤其是类库中的函数,免得象我这样的菜鸟还得开着MSDN才看得似懂非懂。
您又多了一个FANS
  回复  引用    
#22楼  2006-04-11 16:43 | dc [未注册用户]
圣诞节发挥;按时大后方是;地方;圣诞节发;电视机法律;角动量上;法律;但是;浪费角动量;撒酒风觉得胜利;飞机了;安家费了;似的
  回复  引用    
#23楼  2006-04-11 16:45 | dc [未注册用户]
难道说发洒家;发;是发;撒旦;分厘卡的撒;老骥伏枥;圣诞节法;六十九法;类毒素浪费;觉得上;解放;历史;了解撒赖;解放立刻;撒酒风;来得及胜利咖啡碱历史;解放;拉萨解放;里脚手立刻;副教授了;安家费历史;解放军似的;龙卷风;立脚点撒;浪费建立;盛大机发;道路撒酒风立刻;决撒建立;咖啡碱了;撒旦法律;可是答复了;
  回复  引用    
#24楼  2006-05-17 10:30 | Iven [未注册用户]
你试过这个程序在SQL Server2005上跑吗? 在2005上似乎backup可以,Restore会出现问题
  回复  引用    
#25楼  2006-08-03 08:51 | lwsoftjp [未注册用户]
美女竟然也会做程序.太惊人了.
  回复  引用    
#26楼  2006-11-03 11:47 | zt371 [未注册用户]
请问你这个支持在网络共享硬盘上备份和恢复吗?我试着做了几次,都是报打开备份设备错误?
  回复  引用    
#27楼  2007-04-28 15:18 | Sam [未注册用户]
杨丹姐,你加我的QQ好吗?有好事招呼你发财~~~~79084138
  回复  引用    
#28楼  2007-05-31 09:15 | 高佳 [未注册用户]
想看看怎么设计的 .....谢谢啦!
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-09-01 17:51 编辑过


相关链接: