C#實現對數據庫的備份還原(完全)


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();
        }   

        
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM