在获取数据库记录集的时候出现了这个错误
”连接无法用于执行此操作,在此上下文中它可能已被关闭或无效“,
我是新建了一个数据库连接类
以下是数据库类的具体代码:
void ADOConn::OnInitADOConn()
{
//初始化OLE/COM库环境
    ::CoInitialize(NULL);
/* try
{
//创建connection对象
m_pConnection.CreateInstance("ADODB.Connection");    
//设置连接字符串
_bstr_t strConnect="uid=;pwd=;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=dB1.mdb;";
//SERVER和UID,PWD的设置根据实际情况来设置
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
//捕捉异常*/
HRESULT m_pHresult;
CADOdatabaseDlg mainDlg;
try
{
//创建connection对象
m_pHresult = m_pConnection.CreateInstance("ADODB.Connection");
if(SUCCEEDED(m_pHresult))
{
switch(mainDlg.m_testMethodNum)
{
   case 0:
   m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\仿真.mdb'","","",adModeUnknown);
   break;
   case 1:
   m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\在线.mdb'","","",adModeUnknown);
   break;
   case 2:
    m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\同步.mdb'","","",adModeUnknown);
   break;
   case 3:
    m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\激光.mdb'","","",adModeUnknown);
   break;
   case 4:
    m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\光栅.mdb'","","",adModeUnknown);
   break;
   case 5:
    m_pHresult = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='D:\\横移动态检测数据包\\平面运动.mdb'","","",adModeUnknown);
   break;
   default:
   break;
}
//连接数据库
}
}
catch(_com_error e)
{
//显示错误信息
AfxMessageBox(e.Description());
return;
}}void ADOConn::ExitConnect()
{
//关闭记录集和连接
if(m_pRecordset->State == adStateOpen )
{
m_pRecordset->Close();
}
if(m_pConnection->State == adStateOpen)
{
m_pConnection->Close();
} //释放环境
::CoUninitialize();}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
    try
   { 
OnInitADOConn();
if(m_pRecordset == NULL)
{
    m_pRecordset.CreateInstance(__uuidof(Recordset));
            m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
   }
    catch(_com_error e)
   {
AfxMessageBox(e.Description());
   }
return m_pRecordset;
}
我在主窗口中是这样调用的:
    sql.Format("select * from MSysObjects where type=1 and flags=0 and DateCreate <=#%s# and DateCreate >=#%s# ",s1,s2);
   _RecordsetPtr pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
当我执行到GetRecord函数的m_pRecordset->Open()这一句的时候,就报错,请问有没有人能我看看这是什么问题,我已经调试了好久了,谢谢

解决方案 »

  1.   

    m_pConnection 一直在打开数据库,却看不到关闭数据库的语句。 一个已经用独占方式打开的数据库是不能被再打开的。
      

  2.   

    CoInitialize不需要重复调用,只需要在程序初始化的时候调用一次就可以了。
    CoUninitialize也是的,在程序结束的时候调用一次就可以了。
    把m_pRecordset做成临时变量再试试。
      

  3.   

    所有的 m_pHresult = m_pConnection->Open(...)改为 if (m_pConnection->IsOpen()){
            m_pConnection->Close();
    }m_pHresult = m_pConnection->Open(...)
      

  4.   

    我前段时间遇到和楼主一样的问题,我说一下我的情况和解决办法,看楼主是不是可以借鉴一下。
      我在主窗口中写的打开数据库的连接,此时的智能指针m_pRecordset->Open当然是没有问题的。
      我在子窗口中也要用到数据库的查询,我当时用的是是一个新的_RecordsetPtr  m_pRecordset,就直接->open,
    没有重新连接数据库。RecordsetPtr  m_pRecordset这个智能指针是操作结果集的,所以它的前提是数据库必须连接上。
       
    我在主窗口中是这样调用的:
        sql.Format("select * from MSysObjects where type=1 and flags=0 and DateCreate <=#%s# and DateCreate >=#%s# ",s1,s2);
       _RecordsetPtr pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
    当我执行到GetRecord函数的m_pRecordset->Open()这一句的时候,就报错。
    楼主犯的错和我当初一样,一个新的_RecordsetPtr  m_pRecordset,就直接->open,你看一下是不是你在主窗口中并没有连接数据库?
    虽然我也不是很清楚为什么,但是貌似主窗口和子窗口中数据库的连接是不相关的,你必须重新连接,再用_RecordsetPtr  m_pRecordset
    去操作结果集。我后来在子窗口和主窗口中都各自连接数据库,就好了!