连接无法用于执行此操作,在此上下文中它可能已被关闭或无效
在获取数据库记录集的时候出现了这个错误
”连接无法用于执行此操作,在此上下文中它可能已被关闭或无效“,
我是新建了一个数据库连接类
以下是数据库类的具体代码:
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
去操作结果集。我后来在子窗口和主窗口中都各自连接数据库,就好了!