为什么同样的代码,备份的时候就可以建立数据库连接,而还原时就建立不了数据库连接呢。真的奇怪的事情。如下是原代码
CADOConn:
CADOConn::CADOConn()
{
OnInitADOConn();
}CADOConn::~CADOConn()
{
ExitConn();
}//初始化,并打开数据库连接
BOOL CADOConn::OnInitADOConn()
{
SetADOStr();

if (FAILED(::CoInitialize(NULL)))
{
AfxMessageBox("OLE初始化失败!");
return FALSE;
}
else
{
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection"); //创建数据库连接对象实例

if (FAILED(hr))
{
AfxMessageBox("创建连接失败!");
return FALSE;
} m_pConnection->Open((_bstr_t)m_strConn, "", "", adModeUnknown);
return TRUE;
}
catch (_com_error e)
{
AfxMessageBox(e.Description());
return FALSE;
}
}
}
............................
............................void CADOConn::ExitConn()
{
if (m_pRecordset != NULL)
{//关闭数据集
m_pRecordset->Close();
}
if (m_pConnection != NULL || m_pConnection->State != adStateClosed)
{//关闭连接
m_pConnection->Close();
}
::CoUninitialize();
}void CADOConn::SetADOStr()
{
char strConfig[4][30];
CString strFileName = ".\\Config.ini"; //得到INI文件信息
GetPrivateProfileString("ADOConfig", "SERVER", "LOCALHOST", strConfig[0], 30, strFileName);
GetPrivateProfileString("ADOConfig", "DATABASE", "EXPRESS", strConfig[1], 30, strFileName);
GetPrivateProfileString("ADOConfig", "UID", "SA", strConfig[2], 30, strFileName);
GetPrivateProfileString("ADOConfig", "PWD", "", strConfig[3], 30, strFileName); m_strConn.Format("Provider=SQLOLEDB; Server=%s; Database=%s; UID=%s; Pwd=%s;",
strConfig[0], strConfig[1], strConfig[2], strConfig[3]);
}//执行事务
BOOL CADOConn::ExecuteTrans(_bstr_t &bstrSQL)
{
if (m_pConnection == NULL || m_pConnection->State == adStateClosed)
{//连接为空,或为关闭
if (!OnInitADOConn())
{//连接打开不成功
m_pRecordset = NULL;
return FALSE;
}
} try
{
m_pConnection->BeginTrans();
m_pConnection->Execute(bstrSQL, NULL, adCmdText);
m_pConnection->CommitTrans();
return TRUE;
}
catch (_com_error e)
{
m_pConnection->RollbackTrans();
AfxMessageBox(e.Description());
return FALSE;
}
}是备份里面的代码:       UpdateData(); if (m_strPath.IsEmpty())
{//为空
MessageBox("路径不能为空!请选择路径", "提示", MB_OK | MB_ICONINFORMATION);
return;
}
if (m_strFileName.IsEmpty())
{
MessageBox("文件名不能为空!请选择路径", "提示", MB_OK | MB_ICONINFORMATION);
return;
} if (IDCANCEL == MessageBox("确定要执行备份操作?", "提示", MB_ICONINFORMATION | MB_OKCANCEL))
{
return;
} CString strPath;
CString strSQL;
CADOConn ado;
_bstr_t bstrSQL; strPath = m_strPath + "\\" + m_strFileName + ".dat";

strSQL.Format("USE master BACKUP DATABASE Express TO DISK = '%s'", strPath);
bstrSQL = strSQL; m_btnOK.SetWindowText("备份中");
m_btnOK.EnableWindow(FALSE);

if(ado.ExecuteTrans(bstrSQL))
{
m_btnOK.SetWindowText("确定");
m_btnOK.EnableWindow(TRUE);
MessageBox("备份完成!", "提示", MB_OK | MB_ICONINFORMATION);
}
else
{
m_btnOK.SetWindowText("确定");
m_btnOK.EnableWindow(TRUE);
MessageBox("备份时出错!", "提示", MB_OK | MB_ICONINFORMATION);
}还原的代码:        UpdateData(); if (m_strPath.IsEmpty())
{
MessageBox("路径不能为空!", "提示", MB_OK | MB_ICONEXCLAMATION);
} if (IDCANCEL == MessageBox("确定要执行还原操作?", "提示", MB_ICONINFORMATION | MB_OKCANCEL))
{
return;
} m_btnOK.SetWindowText("还原中");
m_btnOK.EnableWindow(FALSE);

CADOConn ado;
_bstr_t bstrSQL;
CString strSQL; strSQL.Format("USE master RESTORE DATABASE Express FROM DISK = '%s'",
m_strPath);
bstrSQL = strSQL; if (ado.ExecuteTrans(bstrSQL))
{
m_btnOK.SetWindowText("确定");
m_btnOK.EnableWindow(TRUE); MessageBox("还原成功!", "提示", MB_OK | MB_ICONEXCLAMATION);
}
else
{
m_btnOK.SetWindowText("确定");
m_btnOK.EnableWindow(TRUE);

MessageBox("还原失败!", "提示", MB_OK | MB_ICONEXCLAMATION);
}

解决方案 »

  1.   

    服务器: 消息 3101,级别 16,状态 2,行 1
    因为数据库正在使用,所以未能获得对数据库的排它访问权。
    服务器: 消息 3013,级别 16,状态 1,行 1
    RESTORE DATABASE 操作异常终止。//restore前要先停止数据库
    //在还原过程中,指定的数据库必须不处于使用状态。指定数据库中的任何数据将由还原的数据替换。
      

  2.   

    1、跟踪还原时m_pConnection的值是多少
      

  3.   

    可是连连接都连不了,还没有到执行SQL语句呢
      

  4.   

    你要还原数据库名为MASTER,首先你备份是可以的,还原为什么不行,主要是你要先断开与MASTER的连接,
    到要还原时,你应重新去连接其它数据库,关闭与MASTER的连接pConn->Close()。与其它数据库连接成功后再
    去使用命令"restore database 数据库名 from disk=''",不要在前面加什么use master,多此一举.