C#实现对数据库的备份还原

( 用SQL语句实现对数据库备份还原操作

备份SqlServer数据库:
  backup database 数据库名 to disk (备份文件存放路径+文件名).bak

  还原SqlServer数据库:
  string path = this.FileUpload1.PostedFile.FileName; //获得备份路径及数据库名称 
  use master restore database 数据库名 from disk='" + path + "'"; )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Data.Sql;
using System.IO;

namespace 数据库备份
{
    public partial class Form1 : Form
    {
        //需要添加一个引用C:\Program Files\Microsoft SQL Server\80\Tools\Binn下的SQLDMO.DLL;
        //SQL默认安装下是在以上路径
        //备份的文件放在C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP下
        string ServerName = "";
        string UserName = "sa";//暂时锁定,可以根据需要自己设置
        string Password = "sa";
       
        public Form1()
        {
            InitializeComponent();
            
        }
        //获取服务器列表
        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));
                    //comboBox1.Items.Add(serverList.Item(i));
                    listBox1.Items.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)
        {
            string ServerName = strServerName;
            string UserName = strUserName;
            string 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);
                    listBox2.Items.Add(db.Name);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("连接数据库出错:" + e.Message);
            }
            finally
            {
                svr.DisConnect();
                sqlApp.Quit();
            }
            return alDbs;
        }
        //备份数据
        public bool BackUPDB(string strDbName, string strFileName, ProgressBar pgbMain)
        {
            ProgressBar 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));
            }
            finally
            {
                svr.DisConnect();
            }
        }
        //进度条
        private void Step(string message, int percent)
        {
            PBar.Visible = true;
             PBar.Value = percent;
        }
        //还原数据
        public bool RestoreDB(string strDbName, string strFileName, ProgressBar pgbMain)
        {
            ProgressBar 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();
            }
        }

private void Form1_Load(object sender, EventArgs e)
        {
            GetServerList();
            string ServerName = "(local)";//这里根据需要自己可以设置成动态的
            GetDbList(ServerName, UserName, Password);
        }
        //根据选择的服务器,列出数据库
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {    //这里可以动态设置服务器名,角色名,密码
            //string ServerName = listBox1.SelectedItem.ToString();
            //GetDbList(ServerName, UserName, Password);
           
        }

private void SelectPath_Click(object sender, EventArgs e)
        { 
            //选择保存路径
            //if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK)
            //{
            //    string path = folderBrowserDialog1.SelectedPath + "\\";
            //    txtPath.Text = path;
               
            //}
            //else
            //{
            //   folderBrowserDialog1.Dispose();
            //}
        }
        //备份按钮
        private void btnSave_Click(object sender, EventArgs e)
        {
            string strDbName = "db_bookmanage";
            txtSaveName.Text = DateTime.Now.ToString("yyyyMMddhhmmss");
            string strFileName = txtSaveName.Text.ToString().Trim();
            if (BackUPDB(strDbName, strFileName, PBar))
            {
                PBar.Visible = false;
                MessageBox.Show("备份完成!");
            }
           
        }
        //查看历史备份按钮
        private void button2_Click(object sender, EventArgs e)
        {
            listBox3.Items.Clear();
            string[] files = Directory.GetFiles(@"C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP");
            foreach (string file in files)
                listBox3.Items.Add(file.Substring(file.LastIndexOf("\\") + 1, file.Length - file.LastIndexOf("\\") - 1));
        }
        //还原数据按钮
        private void button1_Click(object sender, EventArgs e)
        {
            PBar.Visible = true;
            string strDbName = "db_bookmanage";
            //txtSaveName.Text = DateTime.Now.ToString("yyyyMMddhhmmss");
            if (txtReName.Text == "")
            {
                MessageBox.Show("请选择一个要还原的文件!");
                return;
            }
            string strFileName = txtReName.Text.ToString().Trim();
            if (RestoreDB(strDbName, strFileName, PBar))
            {
                PBar.Visible = false;
                MessageBox.Show("还原完成!");
            }
        }
        //历史备份文件名
        private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtReName.Text = listBox3.SelectedItem.ToString();
        }

}
}

C#实现对数据库的备份还原(完全)的更多相关文章

  1. sql 数据库的备份还原问题

    今天工作中犯了一个严重的错误,就是在sql中写了一个update语句,还没写条件呢,结果误按了F5,唉,太佩服自己啦...这个脑子怎么不管用了呢?? 唉不说了,我在网上翻来覆去的找资料,最终想是不是可 ...

  2. sql数据库的备份还原问题

    sql数据库的备份还原问题 今天工作中犯了一个严重的错误,就是在sql中写了一个update语句,还没写条件呢,结果误按了F5,唉,太佩服自己啦...这个脑子怎么不管用了呢?? 唉不说了,我在网上翻来 ...

  3. mongodb 数据库操作--备份 还原 导出 导入(转)

    mongodb 数据库操作--备份 还原 导出 导入   -------------------MongoDB数据导入与导出------------------- 1.导出工具:mongoexport ...

  4. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法

    SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备 ...

  5. C#中MySQL数据库的备份 还原 初始化

    直接在cmd执行如下代码: mysqldump -h localhost -uroot -p123 --default-character-set=utf8 --opt --disable-keys ...

  6. mongodb 数据库操作--备份 还原 导出 导入

    mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport 一,mongodump备份数据 ...

  7. C# MySQL数据库的备份 还原 初始化

    // 执行创建数据库操作 this.GetExecute(G_Con, "create database if not exists NEWDB"); this.sqlAddres ...

  8. SQL数据库增量备份还原方式

    SQLSERVER2008的备份还原最基本的方式自然是完整备份,然后完整还原即可. 但是如果遇到数据库文件很大,数据量很大,备份和还原需要花费不少时间的时候, 数据库的差异备份自然就成为考虑的备份方案 ...

  9. mysqldump工具实现mysql数据库的备份还原

    简介 冷.温.热备份 冷备:读写操作均不可进行 温备:读操作可执行:但写操作不可执行 热备:读写操作均可执行 MyISAM:温备,不支持热备 InnoDB:都支持 不管是热备还原还是冷备还原,还原时都 ...

随机推荐

  1. Java程序员2016年终总结

    回顾2016年, 很庆幸,自己能在2016年年尾找到一份满意的web后台开发工作.这也是我学习编程以来第一份开发工作,我很是珍惜. 还记得大三接触了Java的JFrame编写的坦克大战之后,就对编程产 ...

  2. SSL&TLS传输层加密协议实现图解--(重要)

    一.SSL&TLS 1.SSL:Secure Sockets Layer ,加密套接字协议层 1)SSL是为网络通信提供安全及数据完整性的一种安全协议,在传输层对网络连接进行加密 Secure ...

  3. Python 之有道翻译数据抓取

    import requests import time def you_dao(): key = input("请输入要翻译的内容:") # key = "哈哈" ...

  4. PHP 之文件锁解决并发问题

    一.参数说明 $handle: 文件资源 $operation: 锁的类型 LOCK_SH: 共享锁 LOCK_EX: 排他锁 LOCK_UN: 释放锁 $wouldblock: 设置为true的时候 ...

  5. hbase + phoenix 单机版安装

    1. 环境: centos 6.5 jdk 1.8.0                                                 http://www.oracle.com/te ...

  6. HDU3336Count the string

    HDU3336Count the string Problem Description It is well known that AekdyCoin is good at string proble ...

  7. P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools

    P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...

  8. 【codeforces 768D】Jon and Orbs

    [题目链接]:http://codeforces.com/contest/768/problem/D [题意] 你有一个水晶; 它每天都会产生一个球??(球有k种) 然后每种球产生的可能性是相同的-& ...

  9. Linux学习总结(3)——Linux实用工具

    1. Windows下同步Linux文件(Linux安装Samba和配置) 场景需求: 安装了Ubuntu在虚拟机上,但是代码编辑或者其它更多的操作的时候,还是习惯在windows下进行.如果wind ...

  10. 洛谷 P2486 BZOJ 2243 [SDOI2011]染色

    题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...