在获取数据库记录集的时候出现了这个错误
”连接无法用于执行此操作,在此上下文中它可能已被关闭或无效“,
我是新建了一个数据库连接类
以下是数据库类的具体代码:
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()这一句的时候,就报错,请问有没有人能我看看这是什么问题,我已经调试了好久了,谢谢
”连接无法用于执行此操作,在此上下文中它可能已被关闭或无效“,
我是新建了一个数据库连接类
以下是数据库类的具体代码:
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()这一句的时候,就报错,请问有没有人能我看看这是什么问题,我已经调试了好久了,谢谢
解决方案 »
- 急!!!导入图标问题 求高手、、
- 靠,恨死 CStringArray 这个垃圾东西了,靠,随便咋整都是内存泄漏
- STL问题
- 请问如何跨类调用函数
- 第一天接触编程,应该看点什么书?
- 在CServer::OnReceive中的错误???在线等急 急 急谢谢
- 如何实现在对话框的picture控件中画图
- 如何做一个类似与资源管理器右边的视图
- error C2512: 'Adolinking' : no appropriate default constructor available
- vc中是否提供了类似“写字板”的控件,可显示超过32K的文本。哪位大侠能详细告知,除了感谢之外,给分多多。急!!!
- MFC在对话框中绘制图形
- vc 如何读取远程的共享文件夹中的文件
CoUninitialize也是的,在程序结束的时候调用一次就可以了。
把m_pRecordset做成临时变量再试试。
m_pConnection->Close();
}m_pHresult = m_pConnection->Open(...)
我在主窗口中写的打开数据库的连接,此时的智能指针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
去操作结果集。我后来在子窗口和主窗口中都各自连接数据库,就好了!