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="还原数据库" />
<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>
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="还原数据库" />
<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;
}
{
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;
}