SQL数据库还原

在备份的时候,我是把备份的库放在了文件夹下,名字和日期写入了单独的ACCESS库。方法如下:
http://www.cnblogs.com/mayingchao/archive/2009/08/14/1545919.html
还原时用个gridview列表显示出来,再加上删除和还原库按钮就OK了。

前台

<asp:GridView ID="gdvbf" runat="server" AutoGenerateColumns="False" BackColor="#BEBEBE"
                                        BorderColor
="#BEBEBE" Width="100%" OnRowCommand="gdvbf_RowCommand">
<Columns>
       
<asp:BoundField DataField="id" HeaderText="id" Visible="false">
            
<ItemStyle HorizontalAlign="Left" />
       
</asp:BoundField>
       
<asp:BoundField DataField="sjmc" HeaderText="数据库名" />
       
<asp:BoundField DataField="bfrq" HeaderText="备份日期">
              
<ItemStyle HorizontalAlign="Center" />
        
</asp:BoundField>
              
<asp:TemplateField HeaderText="操作">
        
<ItemTemplate>
             
<asp:ImageButton ID="ImageButton1" runat="server" ToolTip="还原数据库信息" ImageUrl="../images/8.gif"
                     OnClientClick
="return confirm('确认要还原数据库吗?');" CommandName="UpdateInfo" CausesValidation="False"
                      Width
="16" Height="16" CommandArgument='<%#  Eval("id") %>' AlternateText="还原数据库" />&nbsp;
             
<asp:ImageButton ID="ImgBtnDelete" runat="server" ToolTip="删除备份信息" ImageUrl="../images/l5.gif"
                      OnClientClick
="return confirm('确认要删除吗?');" CommandName="DeleteInfo" CausesValidation="False"
                      Width
="16" Height="16" CommandArgument='<%#  Eval("id") %>' AlternateText="删除" />
        
</ItemTemplate>
        
<ItemStyle HorizontalAlign="Center" />
       
</asp:TemplateField>
</Columns>
</asp:GridView>

后台


private void Bindsjbf()
    {
        
try
        {
            
string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;";
            strConnection 
+= "Data Source=";
            strConnection 
+= Server.MapPath("sjbf.mdb");

            
string str_Sql = "select * from xs_bf";
            OleDbConnection objConnection 
= new OleDbConnection(strConnection);
            objConnection.Open();
            OleDbDataAdapter da 
= new OleDbDataAdapter(str_Sql, objConnection);
            DataSet ds 
= new DataSet();
            da.Fill(ds);
            
            gdvbf.DataSource 
= ds.Tables[0].DefaultView;
            gdvbf.DataBind();

            objConnection.Close();
            
            
//obj.BindCtrl("select * from xs_bf", gdvbf);

        }
        
catch (Exception ex)
        {
            lblmessage.Text 
= ex.Message;
        }
    }

 

protected void gdvbf_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        
int intID = 0;
        
try
        {
            intID 
= Convert.ToInt32(e.CommandArgument.ToString());

        }
        
catch
        {
            
return;
        }

        
string strMsg = "删除成功";
        
switch (e.CommandName)
        {
            
case "DeleteInfo":

                
string strConnection2 = "Provider=Microsoft.Jet.OleDb.4.0;";
                strConnection2 
+= "Data Source=";
                strConnection2 
+= Server.MapPath("sjbf.mdb");

                
string str_Sql2 = "select sjmc from xs_bf where id = " + intID;

                OleDbConnection objConnection2 
= new OleDbConnection(strConnection2);
                objConnection2.Open();
                OleDbCommand oledbc2 
= new OleDbCommand(str_Sql2, objConnection2);
                
string usjmc2 = oledbc2.ExecuteScalar().ToString();

                objConnection2.Close();

                
//删除数据,先删文件夹下的数据库
               

                
string fName = Server.MapPath("../databak/"+ usjmc2;

                
if (File.Exists(fName))
                {
                    File.Delete(fName); 
//删除文件,别忘了检查一下有没有这个文件 ,即使文件夹下没有这个数据,也继续删除列表中的数据库名称
                }
                
//删除数据,再删表内的数据库名称

                
string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;";
                strConnection 
+= "Data Source=";
                strConnection 
+= Server.MapPath("sjbf.mdb");

                
string str_Sql = "delete from xs_bf where id =" + intID;
                OleDbConnection objConnection 
= new OleDbConnection(strConnection);
                objConnection.Open();

                OleDbCommand oledbc 
= new OleDbCommand(str_Sql, objConnection);
                oledbc.ExecuteNonQuery();

                objConnection.Close();

                ScriptManager.RegisterStartupScript(Page, 
typeof(Page), "bp_" + e.CommandName, "<script   language=\"javascript\">alert('" + strMsg + "')</script>"false);
                Bindsjbf();


                
break;
            
case "UpdateInfo":
                
//数据还原
                string strMsg1 = "数据库还原成功";
                
string strConnection1 = "Provider=Microsoft.Jet.OleDb.4.0;";
                strConnection1 
+= "Data Source=";
                strConnection1 
+= Server.MapPath("sjbf.mdb");

                
string str_Sql1 = "select sjmc from xs_bf where id = " + intID;

                OleDbConnection objConnection1 
= new OleDbConnection(strConnection1);
                objConnection1.Open();
                OleDbCommand oledbc1 
= new OleDbCommand(str_Sql1, objConnection1);
                
string usjmc1 = oledbc1.ExecuteScalar().ToString();

                objConnection1.Close();


                
string fName1 = Server.MapPath("../databak/"+ usjmc1;


                
//这个数据还原的原理,是先把活动链接寄托在master表,然后杀死准备还原的数据库进程,然后再根据路径进行数据库还原
                
//这么做就必须要得到master表的权限,一般空间可能没有权限,那就得多新建一个空库用来寄托进程用了。。不知道更好的办法
                string sql = "USE [master]; RESTORE DATABASE [00xs_0904] FROM  DISK ='" + fName1 + "' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 10;use [00xs_0904];";
                
try
                {

                    obj.RunSql(sql);   
//执行SQL语句 这里手动写代码吧
                    ScriptManager.RegisterStartupScript(Page, typeof(Page), "bp_" + "还原""<script   language=\"javascript\">alert('" + strMsg1 + "')</script>"false);

                }
                
catch (Exception ex)
                {
                    lblmessage.Text 
= ex.Message;
                    lblmessage.Visible 
= true;

                }


                
break;
            
default:
                
return;
        }

 

posted on 2009-08-14 11:53  马英超  阅读(979)  评论(0编辑  收藏  举报