刚刚完成一个员工管理系统,系统是用VC+SQL开发的,在系统开发过程中遇到了一个愣郁闷的问题。菜单中有一块数据维护功能,也就是常用的数据库备份和数据库还原,数据库备份功能很顺利的完成了,但是数据库还原功能始终不行,报错:“.........没有权限........”,之后在网上查了好多资料才明白,用VC打开程序后,会与数据库连接,但是要还原数据库时还不能有与你要还原的数据库连接的进程,感觉挺矛盾。下面我把解决问题的源码写下来,供遇到同样问题的朋友参考。
数据库备份部分:
// 初始化、连接数据库
void ADOConn::OnInitADOConn()
{
// 初始化OLE/COM库环境
::CoInitialize(NULL);
try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = "Provider=SQLOLEDB; Server=(local);Database=Hospinfo/*要连接的数据库名称*/; uid=sa; pwd=1;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
//备份数据库文件
void ADOConn::BackUp(CString FilePath)
{
if (FilePath != "")
{
try
{
//连接数据库
OnInitADOConn();
_bstr_t vSQL;
vSQL = "backup database Hospital to disk = '"+FilePath+"'";
ExecuteSQL(vSQL);
ExitConnect();
AfxMessageBox("数据库备份成功!");
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
AfxMessageBox(e.Description());
}
}
else
{
AfxMessageBox("请指定备份数据路径!");
}
}
数据库还原部分:
//还原数据库文件
void ADOConn::ReStore(CString FilePath)
{
if (FilePath != "")
{
try
{
//OnInitADOConn();
m_pConnection.CreateInstance("ADODB.Connection");
_bstr_t strConnect = "Provider=SQLOLEDB; Server=(local); Database=master; uid=sa; pwd=1";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
}
_bstr_t vSQL;
vSQL= "restore database Hospital from disk = '"+FilePath+"'";
m_pConnection->Execute(vSQL, NULL, adCmdText);
AfxMessageBox("数据库还原成功!");
}
else
{
AfxMessageBox("请指定还原数据路径!");
}
}
注意上面红色的部分,这就是关键。
这时如果在程序里面进行编译、执行程序的话,当执行数据库还原功能时,系统还是会报错,解决方法:VC中编译生成可执行程序后,关闭VC,直接去运行生成的可执行程序,这时再还原数据库就不会出错了。