VC中ADO类的继承问题 最近在学习VC环境下使用ADO连接数据库的方法,其中每次连接数据库的时候要创建一个ConnectionPtr的智能指针对象,然后利用Open()函数来打开数据库,下来就是觉得每次调用Open()函数的时候需要设置的参数太多,于是就像自己写一个类,继承原来ADO对象的所有功能,并将其改造成符合自己特殊要求的类,但是不知道在如何来继承,这和普通的类的继承似乎有所不一样,不知道有没有人知道如何做呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有必要继承ADO的类, 定义一个全局的ConnectionPtr的指针,打开一次以后可以一直用了,程序关闭之后在关闭连接就好了. 曾经这样写过个,给LZ参考下头文件#pragma once #import "C:\Program Files\Common Files\System\ado\msado20.tlb" rename_namespace("ADODB") rename("EOF","ADOEOF")using namespace ADODB;class CDBOperate{public: CDBOperate(); ~CDBOperate(); BOOL Open(LPCTSTR szConString); BOOL IsOPen(); VOID Close(); BOOL ExecuteSQL(LPCTSTR szSQL); BOOL GetRecordset(LPCTSTR szSQL, _Recordset** ppRst); _ConnectionPtr GetConnection() {return m_pDBCon;}private: _ConnectionPtr m_pDBCon;};实现文件#include "DBOperate.h"CDBOperate::CDBOperate(){ m_pDBCon = NULL;}CDBOperate::~CDBOperate(){ Close();}BOOL CDBOperate::Open(LPCTSTR szConString){ HRESULT hr; BOOL bOK(FALSE); if(IsOPen()) { Close(); } try { if(m_pDBCon == NULL) { hr = m_pDBCon.CreateInstance(__uuidof(Connection)); if(FAILED(hr)) { goto __Open_END; } } m_pDBCon->PutConnectionTimeout(long(5)); m_pDBCon->PutCursorLocation(adUseClient); hr = m_pDBCon->Open((_bstr_t)szConString, _T(""), _T(""), -1); if(SUCCEEDED(hr)) { bOK = TRUE; } } catch (...) { goto __Open_END; } return bOK;__Open_END: Close(); return bOK;}BOOL CDBOperate::IsOPen(){ BOOL bOpen(FALSE); try { if(m_pDBCon != NULL && (m_pDBCon->State == adStateOpen)) { bOpen = TRUE; } } catch (...) { NULL; } return bOpen;}VOID CDBOperate::Close(){ try { if(m_pDBCon != NULL) { if(m_pDBCon->State == adStateOpen) { m_pDBCon->Close(); } m_pDBCon = NULL; } } catch (...) { NULL; }}BOOL CDBOperate::ExecuteSQL(LPCTSTR szSQL){ BOOL bOK(FALSE); if(IsOPen()) { try { m_pDBCon->Execute(_bstr_t(szSQL), NULL, adExecuteNoRecords); bOK = TRUE; } catch (...) { NULL; } } return bOK;}BOOL CDBOperate::GetRecordset(LPCTSTR szSQL, _Recordset** ppRst){ BOOL bOK(FALSE); if(IsOPen()) { try { HRESULT hr; _RecordsetPtr pRs = NULL; hr = pRs.CreateInstance(__uuidof(Recordset)); if(SUCCEEDED(hr)) { pRs->CursorLocation = adUseClient; hr = pRs->Open(_variant_t(szSQL),m_pDBCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText); if(SUCCEEDED(hr)) { *(ppRst) = pRs; pRs.Detach(); bOK =TRUE; } } } catch (...) { NULL; } } return bOK;} http://www.codeproject.com/database/adoclasses.asp 当我们需要同时打开好几个记录集的时候就会发现有必要继承了,首先原始的ADO中的类的参数设置比较多,很多时候我们需要的参数是一样的,而且我们需要用到原始ADO类中的很多方法,如果每个都封装的话,效率就不高了,不知四楼的能不能给我发一份,再下不胜感激,只要_ConnectionPtr和_ResultsetPtr的继承类即可。[email protected] 《Windows程序设计》文本输出部分的问题 谁可以给我分享一点支持VS2010 mfc 的皮肤吖 比如BCG 一个韩文的MFC程序,如何转换为中文程序? GDI+ 如何在保存图像上接着画图 数字排序代码的一个问题 如何实现mediaplayer那样的音量控件的(三角形的那种) GlobalLock是用于锁定内存? 怎样把十进制转化为二进制? 再线等!! 有没有帮我看看这句话怎么理解? ado方式如何获取指定数据记录值 UNICODE下如何实现inet_addr()和GetIPAddress()的功能 郁闷了数天的问题,如何单击CTreeCtrl的节点即允许编辑文本
#pragma once #import "C:\Program Files\Common Files\System\ado\msado20.tlb" rename_namespace("ADODB") rename("EOF","ADOEOF")
using namespace ADODB;class CDBOperate
{
public:
CDBOperate();
~CDBOperate();
BOOL Open(LPCTSTR szConString);
BOOL IsOPen();
VOID Close();
BOOL ExecuteSQL(LPCTSTR szSQL);
BOOL GetRecordset(LPCTSTR szSQL, _Recordset** ppRst);
_ConnectionPtr GetConnection() {return m_pDBCon;}private:
_ConnectionPtr m_pDBCon;
};实现文件
#include "DBOperate.h"CDBOperate::CDBOperate()
{
m_pDBCon = NULL;
}
CDBOperate::~CDBOperate()
{
Close();
}
BOOL CDBOperate::Open(LPCTSTR szConString)
{
HRESULT hr;
BOOL bOK(FALSE);
if(IsOPen())
{
Close();
}
try
{
if(m_pDBCon == NULL)
{
hr = m_pDBCon.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
{
goto __Open_END;
}
}
m_pDBCon->PutConnectionTimeout(long(5));
m_pDBCon->PutCursorLocation(adUseClient);
hr = m_pDBCon->Open((_bstr_t)szConString, _T(""), _T(""), -1);
if(SUCCEEDED(hr))
{
bOK = TRUE;
}
}
catch (...)
{
goto __Open_END;
}
return bOK;__Open_END:
Close();
return bOK;
}
BOOL CDBOperate::IsOPen()
{
BOOL bOpen(FALSE);
try
{
if(m_pDBCon != NULL && (m_pDBCon->State == adStateOpen))
{
bOpen = TRUE;
}
}
catch (...)
{
NULL;
} return bOpen;
}
VOID CDBOperate::Close()
{
try
{
if(m_pDBCon != NULL)
{
if(m_pDBCon->State == adStateOpen)
{
m_pDBCon->Close();
}
m_pDBCon = NULL;
}
}
catch (...)
{
NULL;
}
}
BOOL CDBOperate::ExecuteSQL(LPCTSTR szSQL)
{
BOOL bOK(FALSE); if(IsOPen())
{
try
{
m_pDBCon->Execute(_bstr_t(szSQL), NULL, adExecuteNoRecords);
bOK = TRUE;
}
catch (...)
{
NULL;
}
}
return bOK;
}
BOOL CDBOperate::GetRecordset(LPCTSTR szSQL, _Recordset** ppRst)
{
BOOL bOK(FALSE);
if(IsOPen())
{
try
{
HRESULT hr;
_RecordsetPtr pRs = NULL;
hr = pRs.CreateInstance(__uuidof(Recordset));
if(SUCCEEDED(hr))
{
pRs->CursorLocation = adUseClient;
hr = pRs->Open(_variant_t(szSQL),m_pDBCon.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText);
if(SUCCEEDED(hr))
{
*(ppRst) = pRs;
pRs.Detach();
bOK =TRUE;
}
}
}
catch (...)
{
NULL;
}
}
return bOK;
}
不知四楼的能不能给我发一份,再下不胜感激,只要_ConnectionPtr和_ResultsetPtr的继承类即可。
[email protected]