读书人

小弟我封装了ADO操作后,为什么一连接数

发布时间: 2012-11-03 10:57:43 作者: rapoo

我封装了ADO操作后,为什么一连接数据库就出现错误,求高手指点一下
这是封装后的代码

C/C++ code
#pragma once#import "C:\Program Files\Common Files\System\ado\msado15.dll"  no_namespace rename("EOF","adoEOF") class CADOConnection//用来连接数据库{private:    static void InitADO();    static void UnInitADO();protected:    _ConnectionPtr m_Connection;public:    BOOL IsOpen();    _ConnectionPtr GetConnection();    CString GetSQLConStr(CString IP,CString DBName);    BOOL Open(CString ConStr);    CADOConnection();    virtual ~CADOConnection();};class CADODataSet//用来存储数据的数据集类{protected:    _RecordsetPtr m_DataSet;    CADOConnection *m_Connection;public:    BOOL Open(CString SQLStr,int LockType);    void Delete();    int GetRecordNo();    void move(int nIndex);    void Save();    void SetFieldValue(CString FieldName,_variant_t Value);    void AddNew();    BOOL Next();    FieldsPtr GetFields();    int GetRecordCount();    void SetConnection(CADOConnection *pCon);    BOOL Open(CString SQLStr);    CADODataSet();    virtual ~CADODataSet();private:    BOOL IsOpen();};CADOConnection * GetConnection();//实现代码// ADO.cpp: implementation of the CADO class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "ADO.h"#include <comdef.h>#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////int ConCount = 0;CADOConnection g_Connection;//全局数据库连接对象CADOConnection * GetConnection(){    return &g_Connection;}CADOConnection::CADOConnection(){    InitADO();    m_Connection.CreateInstance("ADODB.Connection");}CADOConnection::~CADOConnection(){    if (IsOpen())        m_Connection->Close();    m_Connection = NULL;    UnInitADO();}void CADOConnection::InitADO(){        if (ConCount++ == 0)             CoInitialize(NULL);};void CADOConnection::UnInitADO(){        if (--ConCount == 0)             CoUninitialize();};BOOL CADOConnection::Open(CString ConStr){    if (IsOpen())        m_Connection->Close();    m_Connection->Open((_bstr_t)ConStr,"","",adModeUnknown);    return IsOpen();}CString CADOConnection::GetSQLConStr(CString IP, CString DBName){    CString Str;    Str.Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=%s",DBName,IP);    return Str;}_ConnectionPtr CADOConnection::GetConnection(){    return m_Connection;}BOOL CADOConnection::IsOpen(){    long State;    m_Connection->get_State(&State);    if (State == adStateOpen)        return true;    return false;}////////////////////////////////////////CADODataSet::CADODataSet(){    m_DataSet.CreateInstance("ADODB.Recordset");}CADODataSet::~CADODataSet(){    if (IsOpen())        m_DataSet->Close();    m_DataSet = NULL;    m_Connection = NULL;}void CADODataSet::SetConnection(CADOConnection *pCon){    m_Connection = pCon;}int CADODataSet::GetRecordCount(){    if (IsOpen())        return m_DataSet->GetRecordCount();    else        return 0;}BOOL CADODataSet::Open(CString SQLStr){    if (IsOpen())        m_DataSet->Close();    //*/    m_DataSet->Open(_bstr_t(SQLStr),            _variant_t((IDispatch*)g_Connection.GetConnection(), true),            adOpenKeyset, adLockOptimistic, adCmdText);    return IsOpen();    //*/}BOOL CADODataSet::IsOpen(){    long State;    m_DataSet->get_State(&State);    if (State == adStateOpen)        return true;        return false;}FieldsPtr CADODataSet::GetFields(){    return m_DataSet->GetFields();}BOOL CADODataSet::Next(){    if (m_DataSet->adoEOF)        return false;    m_DataSet->MoveNext();    return true;}void CADODataSet::AddNew(){    m_DataSet->AddNew();}void CADODataSet::SetFieldValue(CString FieldName, _variant_t Value){    m_DataSet->PutCollect((_bstr_t)FieldName,Value);}void CADODataSet::Save(){    m_DataSet->Update();}void CADODataSet::move(int nIndex){    m_DataSet->MoveFirst();    m_DataSet->Move(nIndex);}int CADODataSet::GetRecordNo(){    return m_DataSet->AbsolutePosition;}void CADODataSet::Delete(){    m_DataSet->Delete(adAffectCurrent);}BOOL CADODataSet::open(CString SQLStr, int LockType){    if (IsOpen())        m_DataSet->Close();    //*/    m_DataSet->Open(_bstr_t(SQLStr),            _variant_t((IDispatch*)g_Connection.GetConnection(), true),            adOpenKeyset,(LockTypeEnum) LockType, adCmdText);    return IsOpen();} 



现在一连接数据库BOOL bCon=GetConnection()->Open( GetConnection()->GetSQLConStr("127.0.0.1","tb_person") );
就出现人事考试管理系统.exe 中的 0x7556d36f 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x001ef3c8 处的 _com_error。

[解决办法]
自己查查
C/C++ code
try{ ....your code...}catch(_com_error &e){ PrintComError(e);}void PrintComError(_com_error &e){    _bstr_t bstrSource(e.Source());    _bstr_t bstrDescription(e.Description());            // Print Com errors.      printf("Error\n");    printf("\tCode = %08lx\n", e.Error());    printf("\tCode meaning = %s\n", e.ErrorMessage());    printf("\tSource = %s\n", (LPCSTR) bstrSource);    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);}
[解决办法]
太长,一时半休,也看不完,建议下载封装比较好的ADO类
[解决办法]
你没在封装类里的加上初始化OLE的语句,就是AfxInitOle();//就是类似这句,具体忘了
要在构造函数里加上

读书人网 >VC/MFC

热点推荐