zoukankan      html  css  js  c++  java
  • c#网站对服务器的数据库的备份与还原

    在网站上备份数据库

    1.前台页面

    1 <div>
    2         需要备份的文件名:<asp:TextBox ID="bfFile" runat="server" Text="shuJuKu"></asp:TextBox>
    3         <asp:Button ID="btnBak" runat="server" Text="备份" OnClick="btnBak_Click" />&nbsp;
    4         <asp:Button ID="btnReduct" runat="server" Text="恢复" OnClick="btnReduct_Click" />&nbsp;
    5         <asp:Button ID="btnDelete" runat="server" Text="删除备份文件" OnClick="btnDelete_Click" />&nbsp;
    6         <asp:Button ID="btnDown" runat="server" Text="下载备份文件" OnClick="btnDown_Click" />
    7 </div>
    前台布局

    2.后台代码

     1 //删除时用到的库
     2 [DllImport("kernel32.dll")]
     3 public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
     4  
     5 [DllImport("kernel32.dll")]
     6 public static extern bool CloseHandle(IntPtr hObject);
     7  
     8 public const int OF_READWRITE = 2;
     9 public const int OF_SHARE_DENY_NONE = 0x40;
    10 public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
    删除时用到的库
     1 protected void btnBak_Click(object sender, EventArgs e)
     2        {
     3            ///
     4            ///备份方法
     5            ///
     6            SqlConnection conn = new SqlConnection("Server=数据库ip地址;Database=要备份的数据库;User ID=用户名;Password=密码;");//连接数据库语句
     7 
     8            SqlCommand cmdBK = new SqlCommand();
     9            cmdBK.CommandType = CommandType.Text;
    10            cmdBK.Connection = conn;
    11            cmdBK.CommandText = @"backup database ccd to disk='"+this.bfFile.Text+".bak' with init";//数据备份语句:backup database 数据库名 to disk='保存路径dbName.bak'
    12 
    13            try
    14            {
    15                conn.Open();
    16                cmdBK.ExecuteNonQuery();
    17                Response.Write("<script>alert("恭喜你,数据成功恢复为所选文档的状态!");</script>");
    18            }
    19            catch (Exception ex)
    20            {
    21                Response.Write("<script>alert("" + ex.Message + "");</script>");
    22            }
    23            finally
    24            {
    25                conn.Close();
    26                conn.Dispose();
    27            }
    28        }
    备份代码
     1 protected void btnDown_Click(object sender, EventArgs e)
     2         {
     3             
     4             //下载的文件和网页的是在同一服务器上
     5 
     6             string fileName = "aaa.bak";//客户端保存的文件名 
     7             string filePath = Server.MapPath("aaa.bak");//路径
     8 
     9             //以字符流的形式下载文件 
    10             FileStream fs = new FileStream(filePath, FileMode.Open);
    11             byte[] bytes = new byte[(int)fs.Length];
    12             fs.Read(bytes, 0, bytes.Length);
    13             fs.Close();
    14             Response.ContentType = "application/octet-stream";
    15             //通知浏览器下载文件而不是打开 
    16             Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
    17             Response.BinaryWrite(bytes);
    18             Response.Flush();
    19             Response.End();
    20         }
    下载代码 
      1 protected void btnReduct_Click(object sender, EventArgs e)
      2         {
      3         ///
      4            ///还原方法
      5            ///
      6 
      7             ///杀死原来所有的数据库连接进程
      8             SqlConnection conn = new SqlConnection();
      9             conn.ConnectionString = "Data Source=数据库的IP地址;Initial Catalog=master;User ID=用户名;pwd=密码";
     10             conn.Open();
     11             string sql = "use [master] SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='要备份的数据库'";
     12             SqlCommand cmd1 = new SqlCommand(sql, conn);
     13             SqlDataReader dr;
     14             ArrayList list = new ArrayList();
     15             try
     16             {
     17                 dr = cmd1.ExecuteReader();
     18                 while (dr.Read())
     19                 {
     20                     list.Add(dr.GetInt16(0));
     21                 }
     22                 dr.Close();
     23             }
     24             catch (SqlException eee)
     25             {
     26                 Response.Write("<script>alert(""+eee.ToString()+"");</script>");
     27             }
     28             finally
     29             {
     30                 conn.Close();
     31             }
     32             //MessageBox.Show(list.Count.ToString());
     33             for (int i = 0; i < list.Count; i++)
     34             {
     35                 conn.Open();
     36                 cmd1 = new SqlCommand(string.Format("KILL {0}", list[i].ToString()), conn);
     37                 cmd1.ExecuteNonQuery();
     38                 conn.Close();
     39                 Response.Write("<script>alert("系统已经清除的数据库线程: " + list[i].ToString() + "
    正在还原数据库!");
     40             }
     41             //这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程
     42             //占用了数据库。
     43             string constr = @"Data Source=数据库的IP地址;Initial Catalog=master;User ID=用户名;pwd=密码";
     44             string database = "myNewDb";
     45             //string path = "D:\shuJuKu.bak";
     46 
     47 
     48             string path = "" + bfFile.Text + ".bak";
     49 
     50             string BACKUP = String.Format("RESTORE DATABASE {0} FROM DISK = '{1}' WITH MOVE ", database, path);//数据恢复语句:restore database 数据库名 from disk='保存路径dbName.bak' WITH MOVE 
     51 
     52             SqlConnection con = new SqlConnection(constr);
     53             con.Open();
     54 
     55             //string sql2 = "select name from sys.database_files";
     56             string sql2 = "restore filelistonly from disk='" + path + "'";
     57             SqlCommand cmd2 = new SqlCommand(sql2, con);
     58             SqlDataReader dr2 = cmd2.ExecuteReader();
     59             string str1 = "";
     60             string str2 = "";
     61             while(dr2.Read())
     62             {
     63                 if (dr2["PhysicalName"].ToString().Contains("mdf"))
     64                 {
     65                     str1 = dr2["LogicalName"].ToString();
     66                 }
     67                 else if (dr2["PhysicalName"].ToString().Contains("ldf"))
     68                 {
     69                     str2 = dr2["LogicalName"].ToString();
     70                 }
     71             }
     72             dr2.Close();
     73 
     74             BACKUP += "'"+str1+"' TO 'd:\sjk.mdf',";///------数据文件还原后存放的新位置
     75             BACKUP += "MOVE '"+str2+"' TO 'd:\sjk.ldf'";//----日志文件还原后存放的新位置
     76 
     77 
     78             //BACKUP += "'" + str1 + "' TO 'd:\shujuku.mdf',";///------数据文件还原后存放的新位置
     79             //BACKUP += "MOVE '" + str2 + "' TO 'd:\shujuku.ldf'";//----日志文件还原后存放的新位置
     80             
     81             SqlCommand cmd = new SqlCommand(BACKUP, con);
     82             
     83             try
     84             {
     85                 cmd.ExecuteNonQuery();
     86                 Response.Write("<script>alert("还原成功,点击退出系统!");</script>");
     87                 //Application.Exit();
     88                 conn.Close();
     89                 conn.Dispose();
     90             }
     91             catch (SqlException ee)
     92             {
     93 
     94                 Response.Write("<script>alert(""+ee.ToString()+"");</script>");
     95 
     96             }
     97             finally
     98             {
     99                 con.Close();
    100             }
    101         }
     1 protected void btnDelete_Click(object sender, EventArgs e)
     2         {
     3 
     4             //不能在服务器上删除,只能手动删除
     5 
     6         ///
     7            ///删除方法
     8            ///
     9        //本地的文件删除,网页和服务器在同一ip下,删除的文件路径需要完整的文件路径
    10 
    11             string vFileName = @"D:\aaa.bak";
    12             if (!File.Exists(vFileName))
    13             {//判断文件是否存在
    14                 Response.Write("<script>alert("文件都不存在,你就不要拿来耍了");</script>");
    15                 return;
    16             }
    17             IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
    18             if (vHandle == HFILE_ERROR)
    19             {//判断文件是否被占用
    20                 Response.Write("<script>alert("文件被占用!");</script>");
    21                 return;
    22             }
    23             else
    24             { 
    25                 CloseHandle(vHandle);
    26                 Response.Write("<script>alert("没有被占用!");</script>");
    27 
    28 
    29                 FileInfo file = new FileInfo("D:\aaa.bak");
    30                 file.Delete();
    31 
    32             }
    33         }

    我只是实现了在服务器上的备份和还原数据库,网页和数据库在同一服务器上下载文件

  • 相关阅读:
    冒泡法排序(整数)
    system函数的应用
    数数的位数(正整数)
    翻译Sencha Touch Architecture 第二章
    BeeFramework
    Creating a masterdetail application with tableview
    翻译Sencha Touch Mobile Javascript Framework 第八章 The Flickr Finder Application
    SDWebImage笔记
    Ubuntu aptget方式安装Subversion
    Python统计svn变更代码行数
  • 原文地址:https://www.cnblogs.com/12jh23/p/6295939.html
Copyright © 2011-2022 走看看