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

