2 myloveiss myloveiss 于 2015.06.25 23:35 提问

请教ADO操作Access库重复用ADO对象的问题

我写了一个CADO类,我在构造函数里初始化com组件,创建连接对象并实例化。在析构函数里清除com组件,并关闭连接对象。我还写个一个函数_Recoreset ExcuteSQL(CString str)
里面定义了一个记录集对象并且实例化,然后将参数转化成SQL 语句,打开记录集并且把记录集返回。

 CADO::CADO()
{
    //初始化COM库
    ::CoInitialize(NULL);
    try
    {
        //创建连接对象实例
        m_pConnection.CreateInstance("ADODB.Connection");
        //设置连接字符串
        CString strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\uid=;pwd=;DBQ=xueshengchengji.mdb;";
        //使用Open方法连接数据库
        m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);

    }
    catch(_com_error e)
    {
        CString errormessage;
        errormessage.Format("%s",e.ErrorMessage());
        AfxMessageBox(errormessage);
}

}

CADO::~CADO()
{
    //关闭记录集和连接
    m_pConnection->Close( );
    m_pConnection.Release( );
    //清除COM库
    ::CoUninitialize( );
}

 _RecordsetPtr CADO::ExecuteSQL(CString bstrSQL)
{
    _RecordsetPtr pRecordset (__uuidof(Recordset));
    try
    {
        pRecordset=m_pConnection->Execute(_bstr_t(bstrSQL), NULL, adCmdText);
    }
    catch(_com_error e)
    {
        CString errormessage;
        errormessage.Format("%s",e.ErrorMessage());
        AfxMessageBox(errormessage);
    }

    return pRecordset;
}

在一个列表框中我想单击列表的某一列,就按此类进行排序(升序或降序)显示。于是我写了如图函数。点击一次实现了排序,但是再次点击时就显示 IDispatch error #3092。SQL语句经测试没有错误。我想是因为在函数里再次调用ExcuteSQL函数和AddToList 函数前没有关闭记录集或者ADO对象(m_ado是CADO类的对象)造成的吧。请问该怎么解决?

 void CTeacherDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    try
    {
        int colum;
        colum = pNMListView->iSubItem;
        switch(colum)
        {
        case 0:

                if(isAsc)
                {
                    bstrSQL+=" order by ClassArrange.CourseID DESC";
                    isAsc=FALSE;
                }
                else
                {
                    bstrSQL+=" order by ClassArrange.CourseID ASC";
                    isAsc=TRUE;
                }
                //m_Recordset.Requery();
                MessageBox(bstrSQL);
                m_List.DeleteAllItems();
                AddToList(bstrSQL);
                break;
        }
}
    catch(_com_error e)
    {
        CString errormessage;
        errormessage.Format("%s",e.ErrorMessage());
        AfxMessageBox(errormessage);
    }

}

 void CTeacherDlg::AddToList(CString bstrSQL)
{
    try
    {
        //打开记录集
        m_pRecordset=m_ado.ExecuteSQL(bstrSQL);
        while(!m_pRecordset->adoEOF)
        {
            m_List.InsertItem(0,"");
            m_List.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("CourseID"));
            m_List.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("CourseName"));
            m_List.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("ClassName"));
            m_List.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("StudentID"));
            m_List.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect("StudentName"));
            m_List.SetItemText(0,5,(char*)(_bstr_t)m_pRecordset->GetCollect("MajorName"));
            m_List.SetItemText(0,6,(char*)(_bstr_t)m_pRecordset->GetCollect("Grade"));
            //将记录集指针移动到下一条记录
            m_pRecordset->MoveNext();
        }
    }
    catch(_com_error e)
    {
        CString errormessage;
        errormessage.Format("%s",e.ErrorMessage());
        AfxMessageBox(errormessage);
    }

}

//以下是SQL语句

    //设置查询字符串
    bstrSQL.Format("SELECT Teacher.TeacherID, ClassArrange.CourseID, Course.CourseName, Class.ClassName, \
         Grade.StudentID, Student.StudentName, Major.MajorName, Grade.Grade\
         FROM Teacher INNER JOIN (((Major INNER JOIN Class ON Major.MajorID = Class.Major)INNER JOIN Student ON \
         Class.ClassID = Student.ClassID) INNER JOIN ((Course INNER JOIN ClassArrange ON Course.CourseID = \
         ClassArrange.CourseID) INNER JOIN Grade ON Course.CourseID = Grade.CourseID) ON Student.StudentID = Grade.StudentID)\
         ON Teacher.TeacherID = ClassArrange.TeacherID WHERE (((Teacher.TeacherID)='%s')) ",m_Name1);

错误信息为:
IDispatch error#3092
Unkoown error 0x800A0E78
当第一次运行函数
void CTeacherDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 时没有错误,再次进入就有问题了。

2个回答

CSDNXiaoF
CSDNXiaoF   2015.06.26 14:10
已采纳

你可以试一下在 void CTeacherDlg::AddToList(CString bstrSQL)里边执行完操作后
把m_pRecordset释放。

myloveiss
myloveiss 谢谢啦,解决了
大约 3 年之前 回复
CSDNXiaoF
CSDNXiaoF   2015.06.26 08:11

图没有。
http://blog.sina.com.cn/s/blog_62e7f8c10100nix1.html
这个网址里边有几个原因。
再者,你把你的代码报错信息和位置都放出来,便于解决问题。

CSDNXiaoF
CSDNXiaoF 回复myloveiss: 你可以试一下在】
大约 3 年之前 回复
myloveiss
myloveiss 代码我刚贴上去了,麻烦看一下
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用ADO操作Access数据库
ADO对象 1、Access内嵌的VBA是用ADO技术开发数据库应用的主要工具,ADO是目前Microsoft通用的数据访问技术; 2、ADO对象模型包括:Connection、Recordset、Record、Command、Parameter、Field、Property、Stream、Error九个对象; 3、主要的ADO对象介绍: 1)Connection对象:ADO对象模型中
ADO对象操作ACCESS代码
ADO对象操作ACCESS代码 ADO对象操作ACCESS代码
利用ADO连接ACCESS数据库,并进行读写操作(MFC)
1. 引入ADO库文件   使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。  #import "C:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 2.CoInitialize(NULL); /
以ado方式链接sqlserver数据库和access数据库 语言:c++
关于基本介绍转自:ADO接口之_ConnectionPtr点击打开链接 ADO中最重要的对象有三个:Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。 三个对象对应的智能指针分别是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。 ADO使用_ConnectionPtr这个指针来操纵Connection对象
VS2015在MFC中使用ADO方法连接Access2013数据库
言归正传,第一个面临的难题就是建一个基于对话框的MFC工程连接到之前已经做好的数据库。首先创建一个基于对话框的MFC应用程序ADO_Access.sln.然后
VB6.0编写 ADO对象连接操作Access数据库
VB6.0编写 ADO对象连接操作Access数据库 VB6.0编写 ADO对象连接操作Access数据库
ADO对象的使用
在上一遍文章中我们说了VB中基于ADO的数据库访问,接下来让我们一起来看一下ADO的七个对象,其中我们会重点讲述Command和Recordse两个对象。 我们先通过下面这张图对ADO的七个对象有一个大概的了解:            从图中的关系线以及我们可以看出,当我们通过Connection对象与数据源建立连接以后,既可以通过Recordset对象对数据进行操作,也可以通过Comm
◎Vbs脚本编程简明教程之十六——访问ADO数据库
ADO是Microsoft提供和建议使用的新型数据访问接口,它是建立OLEDB之上的一个抽象层。微软公司在操作系统中默认提供了 Access 的 ODBC 驱动程序以及 JET 引擎,一、对ADO对象的主要操作,一般包括6个方面:1.连接到数据源。通常使用ADO的Connection对象。一般使用相应的属性打开到数据源的连接,设置游标的位置,设置默认的当前数据库,设置将使用的OLEDB
MFC使用ADO方式操作Access数据库
VS2010使用MFC的ADO方式操作Access,实现插入、删除、修改、查询功能,内含有源码和开发说明文档,内容很详细,对初学者绝对有帮助!
小字典之MFC使用ADO访问ACCESS进行增删改查 VS2015开发
找了半天没找到 也实现不老 就自己直接写一个吧  下面先是.h文件和.cpp文件 也就是源文件  然后是一些代码分析 如有不足 感谢指出 谢谢合作 //.h文件 #pragma once #include "afxcmn.h" // C_Final_Dlg 对话框 #import "c:\program files\common files\system\ado\msado15.dll"