代码改变世界

[转载]c#中数据库的备份和恢复

2007-07-27 14:01  Virus-BeautyCode  阅读(776)  评论(0编辑  收藏  举报

//数据备份菜单点击事件
   private void mnuBackUp_Click(object sender, System.EventArgs e)
   {
    frmBackUp back=new frmBackUp(frmBackUp.SetType.BackUp);
    back.Show();
    //调用dll
    BackUpAndReinstate.BackUp backup=new BackUpAndReinstate.BackUp(Application.StartupPath+"\\BackUp\\TeachingBusiness.bak");
    string message=backup.DataBaseBackUp();
    MessageBox.Show(message,"消息",MessageBoxButtons.OK,MessageBoxIcon.Information);
    back.Close();
   }

   //数据恢复菜单点击事件
   private void mnuReinstate_Click(object sender, System.EventArgs e)
   {
    frmBackUp back=new frmBackUp(frmBackUp.SetType.Reinstate);
    back.Show();
    //调用dll
    BackUpAndReinstate.Reinstate reinstate=new BackUpAndReinstate.Reinstate();
    string message=reinstate.DataBaseReinstate();
    MessageBox.Show(message,"消息",MessageBoxButtons.OK,MessageBoxIcon.Information);
    back.Close();
   }

 

frmBackUp窗体代码:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace 教务系统
{
/// <summary>
/// frmBackUp 的摘要说明。
/// </summary>
public class frmBackUp : System.Windows.Forms.Form
{
   private System.Windows.Forms.Label label1;
   private System.Windows.Forms.PictureBox pictureBox1;
   private System.Windows.Forms.Timer timer1;
   private System.ComponentModel.IContainer components;

   public enum SetType
   {
    BackUp,
    Reinstate
   }
   private int type=0;
   public frmBackUp(SetType settype)
   {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent();
    this.type=(int)settype;
    //
    //
   }

   /// <summary>
   /// 清理所有正在使用的资源。
   /// </summary>
   protected override void Dispose( bool disposing )
   {
    if( disposing )
    {
     if(components != null)
     {
      components.Dispose();
     }
    }
    base.Dispose( disposing );
   }

   #region Windows 窗体设计器生成的代码
   /// <summary>
   /// 设计器支持所需的方法 - 不要使用代码编辑器修改
   /// 此方法的内容。
   /// </summary>
   private void InitializeComponent()
   {
    this.components = new System.ComponentModel.Container();
    System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(frmBackUp));
    this.label1 = new System.Windows.Forms.Label();
    this.pictureBox1 = new System.Windows.Forms.PictureBox();
    this.timer1 = new System.Windows.Forms.Timer(this.components);
    this.SuspendLayout();
    //
    // label1
    //
    this.label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
    this.label1.Location = new System.Drawing.Point(8, 8);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(256, 64);
    this.label1.TabIndex = 0;
    this.label1.Text = "正在备份数据,请稍侯......";
    this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
    //
    // pictureBox1
    //
    this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
    this.pictureBox1.Location = new System.Drawing.Point(24, 16);
    this.pictureBox1.Name = "pictureBox1";
    this.pictureBox1.Size = new System.Drawing.Size(64, 48);
    this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
    this.pictureBox1.TabIndex = 1;
    this.pictureBox1.TabStop = false;
    //
    // timer1
    //
    this.timer1.Interval = 300;
    this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
    //
    // frmBackUp
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(272, 80);
    this.Controls.Add(this.pictureBox1);
    this.Controls.Add(this.label1);
    this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    this.Name = "frmBackUp";
    this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
    this.Text = "备份数据...";
    this.Load += new System.EventHandler(this.frmBackUp_Load);
    this.ResumeLayout(false);

   }
   #endregion

   private void timer1_Tick(object sender, System.EventArgs e)
   {
    this.pictureBox1.Image.RotateFlip(RotateFlipType.Rotate90FlipXY);
    this.pictureBox1.Refresh();
   }

//   public void setType(SetType)
//   {
//   
   private void frmBackUp_Load(object sender, System.EventArgs e)
   {
    if(this.type==(int)SetType.BackUp)
     this.label1.Text="正在备份数据,请稍侯......";
    else if(this.type==(int)SetType.Reinstate)
     this.label1.Text="正在恢复数据,请稍侯......";
    this.timer1.Start();
   }
}
}

 

BackUpAndReinstate组件中的类:(BackUp类和Reinstate类)

BackUp类:

using System;
using System.Data;
using System.Data.SqlClient;

namespace BackUpAndReinstate
{
/// <summary>
/// 数据备份类
/// </summary>
public class BackUp
{
   private SqlConnection con=null;       //数据库连接对象
   private string filepath=null;        //备份路径

   //单参构造
   public BackUp(string filepath)
   {
    con=new SqlConnection("database=master;user id=sa;password=sa;data source=(local)");
    this.filepath=filepath;
   }

   //数据备份方法
   public string DataBaseBackUp()
   {
    string str="";
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=con;
    cmd.CommandText="select name from sysdevices where name='TeachingBusiness'";
    con.Open();
    SqlDataReader rdr=cmd.ExecuteReader();
    if(!rdr.Read())
    {
     rdr.Close();
     SqlCommand backcmd=new SqlCommand();
     backcmd.Connection=con;
     backcmd.CommandText="EXEC sp_addumpdevice @devtype,@logicalname,@physicalname";
     SqlParameter param=backcmd.Parameters.Add("@devtype",SqlDbType.VarChar,20);
     param.Value="disk";
     param=backcmd.Parameters.Add("@logicalname",SqlDbType.VarChar,20);
     param.Value="TeachingBusiness";
     param=backcmd.Parameters.Add("@physicalname",SqlDbType.NVarChar,260);
     param.Value=this.filepath;
     backcmd.ExecuteNonQuery();
    }
    rdr.Close();
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    cmd.CommandText="backup database TeachingBusiness to TeachingBusiness";
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    finally
    {
     con.Close();
    }
    str="已备份成功!";
    return str;
   }
}
}

Reinstate类:

using System;
using System.Data;
using System.Data.SqlClient;

namespace BackUpAndReinstate
{
/// <summary>
/// 数据恢复类
/// </summary>
public class Reinstate
{
   private SqlConnection con=null;        //数据库连接对象

   //默认构造
   public Reinstate()
   {
    con=new SqlConnection("database=master;user id=sa;password=sa;data source=(local)");
   }

   //数据恢复方法
   public string DataBaseReinstate()
   {
    string str="";
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=con;
    cmd.CommandText="RESTORE DATABASE TeachingBusiness FROM TeachingBusiness with replace";
    con.Open();
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    finally
    {
     con.Close();
    }
    str="已成功恢复数据库";
    return str;
   }
}
}

BackUpAndReinstate组件中的类:(BackUp类和Reinstate类)

BackUp类:

using System;
using System.Data;
using System.Data.SqlClient;

namespace BackUpAndReinstate
{
/// <summary>
/// 数据备份类
/// </summary>
public class BackUp
{
   private SqlConnection con=null;       //数据库连接对象
   private string filepath=null;        //备份路径

   //单参构造
   public BackUp(string filepath)
   {
    con=new SqlConnection("database=master;user id=sa;password=sa;data source=(local)");
    this.filepath=filepath;
   }

   //数据备份方法
   public string DataBaseBackUp()
   {
    string str="";
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=con;
    cmd.CommandText="select name from sysdevices where name='TeachingBusiness'";
    con.Open();
    SqlDataReader rdr=cmd.ExecuteReader();
    if(!rdr.Read())
    {
     rdr.Close();
     SqlCommand backcmd=new SqlCommand();
     backcmd.Connection=con;
     backcmd.CommandText="EXEC sp_addumpdevice @devtype,@logicalname,@physicalname";
     SqlParameter param=backcmd.Parameters.Add("@devtype",SqlDbType.VarChar,20);
     param.Value="disk";
     param=backcmd.Parameters.Add("@logicalname",SqlDbType.VarChar,20);
     param.Value="TeachingBusiness";
     param=backcmd.Parameters.Add("@physicalname",SqlDbType.NVarChar,260);
     param.Value=this.filepath;
     backcmd.ExecuteNonQuery();
    }
    rdr.Close();
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    cmd.CommandText="backup database TeachingBusiness to TeachingBusiness";
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    finally
    {
     con.Close();
    }
    str="已备份成功!";
    return str;
   }
}
}

Reinstate类:

using System;
using System.Data;
using System.Data.SqlClient;

namespace BackUpAndReinstate
{
/// <summary>
/// 数据恢复类
/// </summary>
public class Reinstate
{
   private SqlConnection con=null;        //数据库连接对象

   //默认构造
   public Reinstate()
   {
    con=new SqlConnection("database=master;user id=sa;password=sa;data source=(local)");
   }

   //数据恢复方法
   public string DataBaseReinstate()
   {
    string str="";
    SqlCommand cmd=new SqlCommand();
    cmd.Connection=con;
    cmd.CommandText="RESTORE DATABASE TeachingBusiness FROM TeachingBusiness with replace";
    con.Open();
    try
    {
     cmd.ExecuteNonQuery();
    }
    catch(SqlException er)
    {
     str=er.Message;
     return str;
    }
    finally
    {
     con.Close();
    }
    str="已成功恢复数据库";
    return str;
   }
}
}