VC+SQL数据库备份、还原

来源:互联网 发布:软件开发接包 编辑:程序博客网 时间:2024/05/17 16:55

刚刚完成一个员工管理系统,系统是用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,直接去运行生成的可执行程序,这时再还原数据库就不会出错了。