SQLDMO由Microsoft SQL Server自带的SQLDMO.dll提供,由于SQLDMO.dll是一个COM对象,SQLDMO(SQL Distributed Management Objects,SQL分布式管理对象)封装了Microsoft SQL Server数据库中的对象。SQLDMO是Microsoft SQL Server中企业管理器所使用的应用程序接口,所以它可以执行很多功能,其中当然也包括对数据库的备份和恢复。
本文要实现如下界面和对应功能:
页面核心代码如下:
<div class="content-wrap">
<div class="row">
<div class="col-sm-12">
<div class="nest" id="tabClose">
<div class="body-nest">
<%-- 内容样式开始 --%>
<div id="divMsg" runat="server" style="color:Red;"></div>
<asp:Panel ID="Panel1" runat="server">
<asp:TextBox ID="txtPath" runat="server" Width="297" CssClass="path" ForeColor="Black" ></asp:TextBox>
<span style="color:Red;">例:C:/DBBack/</span>
</asp:Panel>
<asp:Button ID="btn_backup" runat="server" Text="备份数据库" OnClick="btn_backup_Click" />
<div>还原数据库时请关闭所有和该数据库连接的程序!</div>
<asp:RadioButton ID="sysDirectory" runat="server" Text="系统目录" Checked="True"
GroupName="aa" οnclick="selectRadioButton()" />
<asp:RadioButton ID="otherDirectory" runat="server" Text="其他目录"
GroupName="aa" οnclick="selectRadioButton()" />
<div class="tdControl" style="text-align:left; width:200px;">系统目录文件:</div>
<div class="tdControl">
<asp:Panel ID="Panel2" runat="server">
<asp:ListBox ID="DBList" runat="server" Width="285px" Height="108px"></asp:ListBox>
</asp:Panel>
</div>
<div class="tdControl" style="text-align:left; width:200px;">选择其他目录文件:</div>
<div class="tdControl">
<asp:FileUpload ID="FileUpload1" runat="server" Width="368px" />
</div>
<div style="margin:10px;">
<asp:Button ID="btn_restore" runat="server" Text="恢复数据库" OnClick="btn_restore_Click" />
</div>
</div>
</div>
</div>
</div>
</div>
在用SQLDMO.dll之前必须在.NET项目中添加对它的引用,如下图所示
注意:一定要安装完整的SQLDMO.dll文件,单个该文件会出错,错误见文章最下面。如果默认没有安装的话,要下载SQLDMO完整文件,然后拷贝到C:\Program Files\Microsoft SQL Server\80\Tools\Binn\。
引用正确后,后台加入如下代码:
/// <summary>
/// 数据库备份
/// </summary>
public static void DbBackup()
{
SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(".\\SqlExpress", "sa", "123456");
oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database = "DutySys";
oBackup.Files = @"d:/DutySys.bak";
oBackup.BackupSetName = "DutySys";
oBackup.BackupSetDescription = "数据库备份";
oBackup.Initialize = true;
oBackup.SQLBackup(oSQLServer);
}
catch
{
throw;
}
finally
{
oSQLServer.DisConnect();
}
}
/// <summary>
/// 数据库恢复
/// </summary>
public static void DbRestore()
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(".\\SqlExpress", "sa", "123456");
oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = "DutySys";
oRestore.Files = @"d:/DutySys.bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
}
catch
{
throw;
}
finally
{
oSQLServer.DisConnect();
}
}
在两个页面按钮下调用这两个方法就行:
protected void btn_backup_Click(object sender, EventArgs e)
{
DbBackup();
}
protected void btn_restore_Click(object sender, EventArgs e)
{
DbRestore();
}
通过上面简单的代码就实现了数据库的备份和还原。亲测无误。
还有一种将SQLDMO封装道BLL一个类里面,使用Web.config里面统一的数据库连接字符串,前台直接调用即可。
这些已调试好的都包含到源码里,可以下载自行查看。
过程中遇到的几个错误:
1、提示:检索 COM 类工厂中 CLSID 为 {10020200-E260-11CF-AE68-00AA004A34D5} 的组件时失败,原因是出现以下错误: 80040154如何处理。
方法:
这是没有完整安装该SQLDMOD.DLL文件造成的。
第一步:下载SQLDMOD.DLL.zip(在我的源码中有)后解压,将里面包含的所有msvcr71.dll, SQLDMO.DLL, Resources文件夹整体拷贝到C:\Program Files\Microsoft SQL Server\80\Tools\Binn目录。
第二步:打开CMD输入 regsvr32 " C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll" 注册sqldmo.dll。
regsvr32 "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\
SQLDMO.dll"
2.提示"[Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝 [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). QODBC3: Unable to connect"。
一般是数据库没有配置好,先确认使用sa或其他用户名可以登录;然后就是代码中的 oSQLServer.Connect(".\\SqlExpress", "sa", "123456");第一个参数服务器".\\SqlExpress"没有配置正确。可以尝试(local)或者127.0.0.1。
3.当调试到Server.MapPath时,提示:未能映射路径"/"
是因为需要~符号。比如"~/"或者"~/DBBackUp/"。
资源下载地址:SQLDMO.dll完整包和源码DEMO