1.我已经在stdafx.h中加了如下: 
#import "C:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF")2.在程序的主类里已有如下代码:if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox("OLE初始化出错!");
return FALSE;

3.在我的类实现文件里有个GetDataTableBySQL函数,想返回_RecordsetPtr
// ZAdoDB.cpp: implementation of the ZAdoDB class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "TestVC.h"
#include "ZAdoDB.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////_RecordsetPtr & ZAdoDB::GetDataTableBySQL(CString strSql,CString strConn)
{
_RecordsetPtr pRec=NULL;
_ConnectionPtr pconn=NULL; CString strSRC="Provider=SQLOLEDB.1;Password=A78U86M02D20SS;Persist Security Info=True;User ID=sa;Initial Catalog=LanMsg;Data Source=A78U86M02D20SS\\SQLEXPRESS";
_variant_t varSRC(strSRC);
_bstr_t bstrSRC(varSRC); if(FAILED(pconn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox("Create Connection Failed !");
return pRec;
} if(FAILED(pconn->Open(bstrSRC,"","",-1)))
{
AfxMessageBox("Open Database Failed !");
return pRec;
}
if(FAILED(pRec.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("Create Recordset object failed!");
return pRec;
} _variant_t varSQL(strSql); try
{ if(FAILED(pRec->Open(varSQL,varSRC,adOpenDynamic,adLockOptimistic,adCmdText)))//运行到这一句出错不知为什么,也没有抱什么错,反正就是出错,并且不能捕获?其上面的代码都没有问题,说明连接字符串没有错啊
{
AfxMessageBox("Open Recordset Failed!");
pRec.Release();
return pRec;
}
}
catch(CException ex)
{
LPTSTR LPTSTR1="";;
UINT ERRNUM=0;
AfxMessageBox(ex.GetErrorMessage(LPTSTR1,ERRNUM,NULL));
} //LONG RecCount=pRec->RecordCount();
//RecordList data[]=new RecordList[];
//while(!pRec->GetadoEOF())
//{
// _variant_t strData=pRec->GetCollect("id");
// AfxMessageBox(_bstr_t(strData));
// pRec->MoveNext();
//}
_RecordsetPtr retValue=pRec->Clone(adLockReadOnly);
pRec->Close();
pRec.Release();
return retValue;
}烦劳高手帮忙,看是什么问题?

解决方案 »

  1.   

    catch(CException ex) 

    LPTSTR LPTSTR1="";; 
    UINT ERRNUM=0; 
    AfxMessageBox(ex.GetErrorMessage(LPTSTR1,ERRNUM,NULL)); 
    } 改成这个试试,看能否跳到catch里头
    ==>
    catch(...)
    {
       AfxMessageBox("error!");
    }另外第二个参数有问题,应该为pconn.GetInterface()
    pRec->Open(varSQL,varSRC,adOpenDynamic,adLockOptimistic,adCmdText))
      

  2.   

    _variant_t varSQL(strSql); 
    //strSql的值?
    catch(_com_error)
    {
    }
    catch(...)
    {
    }//至于第二个参数
    ActiveConnection   可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。
    所以只要连接字符串不错,应该没有问题。
      

  3.   

    刚才的回复不见了,生气,再写:
    TO fantuan:
    pRec->Open的原形里第二个参数是const _variant_t &类型啊?我用你的方法GetInterface是不是应该是GetInterfacePtr?用了还是报原来的错误.TO lfchen:
    strSql="select * from MsgInfo";
    我初学VC,有时基本的语法错误或许不知道,劳烦大家写标准点的VC代码,我直接替换;另外,我引用OELDB的前提条件是否够了(贴子里的1,2两条) ?
      

  4.   

    try
    {pRec->Open(varSQL,varSRC,adOpenDynamic,adLockOptimistic,adCmdText)));}
    catch(_com_error e)

    AfxMessageBox(e.Description());
    }
      

  5.   

    不好意思,本人真的将表名搞错了。另外两个简单问题,解决的了结贴:1。什么情况下捕获_com_error类型的错误?通常捕获哪种类型的错误?2。_RecordsetPtr retValue=pRec->Clone(adLockReadOnly);
    这种用法有人用过吗,现在这里出错。
    我的目的是返回一个数据集的拷贝,而将原来的记录集在函数结束前关闭(模拟原来VB的用法)。
      

  6.   

    _com_error:com组件一场,ADO是com,所以ADO错误捕获那个就够了。_RecordsetPtr retValue;
    retValue CreateInstance //先创建接口。