说明:为了定时备份服务器上的数据库并压缩到指定目录,方便下载到本地而写本程序。配合windows的任务计划,可以达到定时备份数据库的目的。

程序需引用SQLDMO.DLL,如电脑上已安装sqlserver,可在C:\Program Files\Microsoft SQL Server\80\Tools\Binn\找到

string ServerName = System.Configuration.ConfigurationSettings.AppSettings["ServerName"];//数据库服务器名
        string UserName = System.Configuration.ConfigurationSettings.AppSettings["UserName"];//数据库用户名
        string Password = System.Configuration.ConfigurationSettings.AppSettings["Password"];//密码
        string strDbName = System.Configuration.ConfigurationSettings.AppSettings["strDbName"];//数据库名
        string FilePathBak = System.Configuration.ConfigurationSettings.AppSettings["FilePathBak"];//备份后的文件保存路径(.bak),不包括文件名
        string FilePathRar = System.Configuration.ConfigurationSettings.AppSettings["FilePathRar"];//压缩文件保存的路径,这里不包括压缩后的文件名

public Form1()
        {
            InitializeComponent();

bool backup = BackUPDB(ServerName, UserName, Password, strDbName, FilePathBak);
            if (backup)
            {
                rar(FilePathBak, FilePathRar);
                del();
            }
            System.Environment.Exit(0);// 这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。            
        }

/// <summary>
        /// 备份数据库
        /// </summary>
        /// <param name="ServerName">服务器名</param>
        /// <param name="UserName">登录账号</param>
        /// <param name="Password">密码</param>
        /// <param name="strDbName">待备份的数据库名</param>
        /// <param name="FilePathBak">备份后的文件保存路径</param>
        /// <returns></returns>
        public bool BackUPDB(string ServerName, string UserName, string Password, string strDbName, string FilePathBak)
        {
            SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
            SQLDMO.Backup bak = new SQLDMO.BackupClass();
            try
            {
                svr.LoginSecure = false;
                svr.Connect(ServerName, UserName, Password);
                bak.Action = 0; //SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
                bak.Initialize = true;

bak.Files = FilePathBak + strDbName + System.DateTime.Now.ToString("yyyyMMdd") + ".bak";//备份后的文件保存路径+文件名(F:\\databack\\fireweb20100810.bak)
                bak.Database = strDbName;
                bak.BackupSetName = strDbName;
                bak.BackupSetDescription = "数据库备份";
                bak.SQLBackup(svr);

return true;
            }
            catch (Exception err)
            {
                throw (new Exception("备份数据库失败" + err.Message));
            }
            finally
            {
                svr.DisConnect();
            }
        }

/// <summary>
        /// 压缩指定文件到指定文件夹
        /// </summary>
        /// <param name="path">被压缩的文件的路径,文件本身在方法中写明,因为文件名要由当前时间判断</param>
        /// <param name="rarPath">压缩后的保存路径</param>
        /// <returns></returns>
        public bool rar(string path, string rarPath)
        {
            bool flag = false;
            System.Diagnostics.Process Pc1 = new System.Diagnostics.Process();
            Pc1.StartInfo.FileName = "Winrar.exe";
            Pc1.StartInfo.CreateNoWindow = false;
            string fileName = strDbName + System.DateTime.Now.ToString("yyyyMMdd")+".bak";
            string rarFileName = strDbName + System.DateTime.Now.ToString("yyyyMMdd") + ".rar";
            path += fileName;//解压前的文件路径+文件名
            rarPath += rarFileName;//解压后的路径+文件名
            Pc1.StartInfo.Arguments = " a -ep " + rarPath + " " + path;//-ep 表示:从名称中排除路径,即压缩时不带各层目录
            Pc1.Start();
            if (Pc1.HasExited)
            {
                int iExitCode = Pc1.ExitCode;
                if (iExitCode == 0)
                {
                    flag = true;
                }
                else
                {
                    flag = false;
                }
                Pc1.Kill();
                Pc1.Close();
                Pc1.Dispose();
            }
            return flag;
        }

/// <summary>
        /// 由于每天备份一次,所以要把多余的备份文件和压缩文件删除,只保留最新的5个
        /// </summary>
        public void del()
        {
            //删除bak文件
            int count1 = 0;
            ArrayList al1 = new ArrayList();
            DirectoryInfo diPathBak = new DirectoryInfo(FilePathBak);
            foreach (FileInfo fi in diPathBak.GetFiles())
            {
                if (fi.Name.Length > 12)//每个备份的bak的文件名长度一定会大于12(20100808.bak)
                {
                    if (fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length - 8).Equals(strDbName) && fi.Extension.Equals(".bak"))
                    {
                        count1++;
                        al1.Add(fi.Name);
                        if (count1 > 5)
                        {
                            string filename = al1[0].ToString();//删除第一个(由于GetFiles()方法按名称升序排序取文件,即删除最早的)
                            File.Delete(diPathBak + filename);
                            al1.RemoveAt(0);
                            count1--;
                        }
                    }
                }
            }

//删除rar文件
            int count = 0;
            ArrayList al = new ArrayList();
            DirectoryInfo diPathRar = new DirectoryInfo(FilePathRar);
            foreach (FileInfo fi in diPathRar.GetFiles())
            {
                if (fi.Name.Length > 12)//每个备份的bak的文件名长度一定会大于12(20100808.bak)
                {
                    if (fi.Name.Substring(0, fi.Name.Length - fi.Extension.Length - 8).Equals(strDbName) && fi.Extension.Equals(".rar"))
                    {
                        count++;
                        al.Add(fi.Name);
                        if (count > 5)
                        {
                            string filename = al[0].ToString();//删除第一个(由于GetFiles()方法按名称升序排序取文件,即删除最早的)
                            File.Delete(diPathRar + filename);
                            al.RemoveAt(0);
                            count--;
                        }

}
                }
            }
        }

winform程序,备份数据库+并压缩+并删除以前的备份的更多相关文章

  1. mysqldump进行数据库的全备时,备份数据库的顺序是什么,就是先备份哪个库,然后再备份哪个库

    需求描述: 今天在用mysqldump工具进行数据库的备份的时候,突然想了一个问题,比如我有10个库要进行备份 那么是先备份哪个,然后再备份哪个呢,所以,做了实验,验证下. 操作过程: 1.使用--a ...

  2. bat脚本,备份数据库并压缩

    forfiles /p "D:\DBBackup" /m "*.sql" /d -08 /c "cmd /c del @path"forfi ...

  3. oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)

    开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~      (当然,你也可以再改简便一点~~~) select db ...

  4. [转载]使用SQL Server 2008的事务日志传送功能备份数据库(logshiping)

    http://www.cnblogs.com/benbenkoala/archive/2009/03/11/1407793.html 引言:SQL Server的事务日志传送备份是仅次于镜像的高可靠性 ...

  5. 通过shell定时备份数据库

    需求: 每天凌晨2:10备份数据库zhengDB到 /data/backup/db. 备份开始和结束能够给出相应提示信息. 备份后的文件标识标准为已备份时间为文件名,并打包成 .tar.gz 的形式, ...

  6. SQL Server 2008备份数据库失败,拒绝访问的原因

    原文:SQL Server 2008备份数据库失败,拒绝访问的原因 备份数据到特定目录是出现拒绝访问,然后测试备份到C盘根目录正常. 查了下原因: 是因为那个目录没有Authenticated Use ...

  7. Navicat for MySQL使用手记(下)--实现自动备份数据库

    五.备份和还原MySQL数据库 在数据库的管理中,备份和还原是必须做认真做的事情,如果疏忽或者做粗糙了,那么一旦数据库故障后果不堪设想,所以Navicat同样也有备份和还原的功能,相比较创建功能,其备 ...

  8. SQL Server 2008怎么自动备份数据库

    在SQL Server 2008数据库中.为了防止数据的丢失我们就需要按时的来备份数据库了.要是每天都要备份的话,人工备份会很麻烦的,自动备份的话就不需要那么麻烦了,只 要设置好了,数据库就会自动在你 ...

  9. python使用多线程备份数据库

    前言:在日常服务器运维工作中,备份数据库是必不可少的,刚工作那会看到公司都是用shell脚本循环备份数据库,到现在自己学习python语言后,利用多进程多线程相关技术来实现并行备份数据库,充分利用服务 ...

随机推荐

  1. C#一些延时函数

    sleep延时方法: System.Threading.Thread.Sleep(); //毫秒 在C#窗口程序中,如果在主线程里调用Sleep,在Sleep完成之前, 界面呈现出假死状态,不能响应任 ...

  2. Linux Cgroups

    目录 Linux Cgroups Cgroups中的三个组件 三个组件的关系 Kernel接口 Docker是如何使用Cgroups的 Go语言实现Cgroups限制容器资源 Linux Cgroup ...

  3. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  4. Swift学习笔记(11)--类与结构体

    类与结构是编程人员在代码中会经常用到的代码块.在类与结构中可以像定义常量,变量和函数一样,定义相关的属性和方法以此来实现各种功能. 和其它的编程语言不太相同的是,Swift不需要单独创建接口或者实现文 ...

  5. web——前后端通信

    前端向后台传输数据: 传输方法:post  get 区别: (1)get:用于从服务器获取数据,将参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看 ...

  6. 上下文切换查看 & sar

    怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在瓶颈,可用sar -b.sar -u和 sar-d来看 sar –W 查看页面交换发生状况 [root@localhost ~] ...

  7. 多线程模式之Master-Worker

    一. 介绍 需要使用Master-Worker的场景:主线程开了多个子进程(Worker进程)去执行任务时,主线程希望能收集到每个子进程的执行结果. 所以,Master-Worker模式基本上就是: ...

  8. js---16继承

    123 instanceof Number;//false,要左边是对象右边是函数 typeof 123 ; //number new Number(123) instanceof Number; / ...

  9. [Codeforces558E]A Simple Task 线段树

    链接 题意:给定一个长度不超过 \(10^5\) 的字符串(小写英文字母),和不超过5000个操作. 每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序. 最后输出最终 ...

  10. 一分钟搞清MyEclipse与Eclipse的关系

    经常在各种论坛会出现一些讨论MyEclipse与Eclipse的,比如两者的使用情况,区别,哪个好,诸如此类的问题,因此在查询资料后感觉有些新的收获这里做些总结. 产地不同 Eclipse 是一个ID ...