小弟,我的程序是采用ADO封装操作access数据库,单独在一个对话框中编译通过,能够实现功能。
但是把它引入到一个含有多个对话框(一个主对话框和四个子对话框)时{方法一样先定声明,后引用},一直提示连接、记录指针无效:[color=#800000]error C2146: syntax error : missing ';' before identifier 'm_pConnection'和error C2501: '_ConnectionPtr' : missing storage-class or type specifiers。

我也仔细检查了#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
 rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库,路径正确,
没有问题。单独在一个主对话框中没有问题,一引入到多个对话框中就不行了。我现在怀疑:是不是需要加入什么头文件之类的东西??我真的无奈了,也请教过师兄,但是还是没有找出原因。有没有高人愿意帮忙,最少100分(莫嫌少我只有这么多)。先谢谢了!!(在线等待)

解决方案 »

  1.   

    主要代码如下:
    [size=10px]一.class ADO  
    {
    public:
    _ConnectionPtr m_pConnection; //连接对象指针
    _RecordsetPtr  m_pRecordset; //记录集对象指针
    public:
    ADO();
    virtual ~ADO(); void OnInitADOConn(); //连接数据库
    _RecordsetPtr&  OpenRecordset(CString sql); //打开记录集
    void CloseRecordset(); //关闭记录集
    void CloseConn(); //关闭数据库连接
    UINT GetRecordCount(_RecordsetPtr pRecordset); //获得记录数
    };
    二.#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
     rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库[/size]
    三.
    ADO::ADO()
    {}ADO::~ADO()
    {}
    void ADO::OnInitADOConn()
    {
    ::CoInitialize(NULL);
    try
    {
           m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象实例
       _bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};\
    uid=;pwd=;DBQ=ABC.mdb;";
       m_pConnection->Open(strConnect,"","",adModeUnknown); //打开数据库
    }
    catch(_com_error e)
    {
    AfxMessageBox(e.Description()); //弹出错误处理
    }
    }_RecordsetPtr&  ADO::OpenRecordset(CString sql)
    {
    ASSERT(!sql.IsEmpty()); //SQL语句不能为空
    try
    {
    m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
    m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
    adOpenDynamic, adLockOptimistic, adCmdText);  //执行SQL得到记录集
    }
    catch(_com_error e) //捕获可能的异常
    {
    AfxMessageBox(e.Description());
    }
    return m_pRecordset;
    }void ADO::CloseRecordset()
    {
      if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
      m_pRecordset->Close(); //关闭记录集
    }void ADO::CloseConn()
    {
    m_pConnection->Close(); //关闭数据库连接
    ::CoUninitialize(); //释放COM环境
    }UINT ADO::GetRecordCount(_RecordsetPtr pRecordset)
    {
    int nCount = 0; //声明保存记录数的变量
    try{
    pRecordset->MoveFirst(); //将记录集指针移动到第一条记录
    }
    catch(...) //捕捉可能出现的错误
    {
    return 0; //产生错误时返回0
    }
    if(pRecordset->adoEOF) //判断记录集中是否没有记录
    return 0;      //无记录时返回0
    while (!pRecordset->adoEOF)  //当记录集指针没有指向最后时
    {
    pRecordset->MoveNext(); //将记录集指针移动到下一条记录
    nCount = nCount + 1;  //记录个数的变量加1
    }
    pRecordset->MoveFirst();     //将记录集指针移动到第一条记录
    return nCount;     //返回记录数
    }
      

  2.   

    在Stdafx.h文件中加入import 
      

  3.   

    .#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
    rename("EOF","adoEOF")rename("BOF","adoBOF") 这就话加在Stdafx.h文件中
      

  4.   

    把那个msado15.tlh文件在VC编译器中打开一下VC中用ADO总是让我觉得很神奇的就是:有时仅仅只是打开了一下,然后再编译,就没事了
      

  5.   

    谢谢,各位大侠,问题解决了,主要是应该先编译stdafx.cpp,把头文件加入到stdafx.cpp然后才能使用,哈哈,谢谢大家了!!