首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

联接无法用于执行此操作,在此上下文中它可能已被关闭或无效

2013-07-09 
连接无法用于执行此操作,在此上下文中它可能已被关闭或无效在获取数据库记录集的时候出现了这个错误”连接

连接无法用于执行此操作,在此上下文中它可能已被关闭或无效
在获取数据库记录集的时候出现了这个错误
”连接无法用于执行此操作,在此上下文中它可能已被关闭或无效“,
我是新建了一个数据库连接类
以下是数据库类的具体代码:
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()这一句的时候,就报错,请问有没有人能我看看这是什么问题,我已经调试了好久了,谢谢
[解决办法]
CoInitialize不需要重复调用,只需要在程序初始化的时候调用一次就可以了。
CoUninitialize也是的,在程序结束的时候调用一次就可以了。
把m_pRecordset做成临时变量再试试。
[解决办法]
我前段时间遇到和楼主一样的问题,我说一下我的情况和解决办法,看楼主是不是可以借鉴一下。
  我在主窗口中写的打开数据库的连接,此时的智能指针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
去操作结果集。我后来在子窗口和主窗口中都各自连接数据库,就好了!

热点排行