读书人

数据库关闭出错?解决方案

发布时间: 2012-01-16 23:36:52 作者: rapoo

数据库关闭出错?
我在还原数据库的时候,调用了ADOConn中的函数ExitConnect()来关闭数据库时出错了,运行的时候出错,语句没错!
void ADOConn::ExitConnect()
{
if(m_pRecordset!=NULL)
m_pRecordset-> Close();
m_pConnection-> Close();
::CoUninitialize();
}
void ADOConn::Restore(CString path)
{
try
{
CString str;
_bstr_t SQL;

str= "restore database system from disk= ";
str.Format(str+ "%s ",path);
SQL=str;
this-> ExecuteSQL(SQL);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}

}
如果没有调用了ADOConn中的函数ExitConnect(),数据库的出错信息是 "因为数据库正在使用,所以未能获得对数据库的排它访问权 "!

请高手现身指教!!!

[解决办法]
因为数据库正在使用,所以未能获得对数据库的排它访问权?
这个错误,并非关闭数据库链接,应该是restore的操作产生的。

假设你链接数据库服务器,其数据库A,然后再这个链接上执行restore A数据库的操作,就会出现

合理的做法是,连接数据库服务器的master数据库,然后restore A数据库,在这个连接上没有对A的访问

[解决办法]
要确定你的链接上的当前活动数据库是否是system
[解决办法]
m_pRecordset-> Close();
m_pRecordset.Release();
m_pRecordset = NULL;
[解决办法]
if(m_pRecordset!=NULL)
m_pRecordset-> Close();只能关闭打开的recordset,要判断一下
m_pConnection-> Close();同样也要判断一下,


if (pRs)
if (pRs-> State == adStateOpen)
pRs-> Close();
if (pRs2)
if (pRs2-> State == adStateOpen)
pRs2-> Close();
if (pConn)
if (pConn-> State == adStateOpen)
pConn-> Close();
[解决办法]
我测试了没有问题
如果链接到master数据,而且没有进行任何对system数据库的操作或者查询。

但假如有其他进程也连接到目标数据库,就很难说,你最好在测试代码之前做一件这样的事情
使用查询分析器连接到master
运行如下脚本,把所有对目标数据库的进程都kill掉,当然你的数据库链接是对master所以,不会被kill

然后调试你的restore操作,就可以成功了

Declare @tblConnectedUsers Table (SPID int)
Declare @vcSQLText varchar(200),@iSPID int,@dbName varchar(20) --数据库名

set @dbName= 'system '

Insert into @tblConnectedUsers
Select p.spid
from master.dbo.sysprocesses p (nolock)
join master..sysdatabases d (nolock) on p.dbid = d.dbid
Where d.[name] = @dbName

While 1 = 1
Begin

Select top 1 @iSPID = SPID
From @tblConnectedUsers
Where SPID > IsNull(@iSPID, 0)
order by SPID asc

If @@RowCount = 0
Break

Set @vcSQLText = 'Kill ' + Convert(varchar(10), @iSPID)
Exec( @vcSQLText )
End

读书人网 >VC/MFC

热点推荐