为什么同样的代码,备份的时候就可以建立数据库连接,而还原时就建立不了数据库连接呢。真的奇怪的事情。如下是原代码
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);
}
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);
}
解决方案 »
- 请问一个问题???关于C++ 的数学函数
- 树控件的节点单选的问题?
- 怎样让对话框程序“不失去”焦点?
- 有没有高手用realplayer G2 Control碰到这样的问题,它里面很多函数返回值为0或者根本不起作用?有人解决过吗?300高分相送,顶着有分!!!!!
- spy++怎么用?是VC自带的吗?若不是在哪里能下到?
- 请问:为什么加个注释也会出错呢?
- 在COM组件中能够创建工作线程吗?和一般的多线程程序相比要注意哪些问题?
- 图形标识点显示,谢谢~~~
- 有关install shield问题。
- 关于在对话框的控件中画图的问题
- vc中 如何实现圆弧类,椭圆弧类的绘制,
- win32application中绘图
因为数据库正在使用,所以未能获得对数据库的排它访问权。
服务器: 消息 3013,级别 16,状态 1,行 1
RESTORE DATABASE 操作异常终止。//restore前要先停止数据库
//在还原过程中,指定的数据库必须不处于使用状态。指定数据库中的任何数据将由还原的数据替换。
到要还原时,你应重新去连接其它数据库,关闭与MASTER的连接pConn->Close()。与其它数据库连接成功后再
去使用命令"restore database 数据库名 from disk=''",不要在前面加什么use master,多此一举.