分享
 
 
 

封装ADO访问数据库的两个类

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

对于初学者,使用ADO访问数据库的时候,涉及到各种数据类型转换,可能有一些难度,我试图封装了ADO访问数据库,使其更方便的用现有的VC的数据类型,更加方便的使用ADO操作数据库。

下面分别提供两个封装ADO数据库访问的类,一个是数据库的连接类,一个是数据库字段访问的类。

在连接类中,大家可以看到,连接类中并没有Recordset的成员变量,因为这样的,在整个数据库应用程序中,数据库的连接一般一个就够了,而同时打开的Reocordset则可能不只一个,所以,如果两个在同一个类里,那么,如果要同时打开两个记录集,需要建立类的两个实例,就是需要同时打开两个数据库连接,如果对于连接的是同一个数据库,同时打开两个连接的话,意味着资源的不必要的浪费。

数据库字段访问类,简化了,获取数据库字段内容的操作,避免了数据类型转换的麻烦。

两个类都对错误处理进行了较多的考虑,在访问数据库中,如果没有错误处理,其害处是显而易见的。

#ifndef _BBADOCONNECT_H

#define _BBADOCONNECT_H

//

// ADO访问数据库类

// 软件环境:需要MSADO15.DLL

// 作者:邓振波

// 2001.4.20

// Email:seesi@163.com

//主页:seesi.51.net

// 说明:封装了ADO使用的操作函数和ADO访问数据库错误处理

// 使在VC上方便的使用ADO访问数据库

// 包括:ADO连接数据库、打开记录集、执行SQL、以及

// 事务处理、ADO记录集内容转换成C++的常用数据类型(CString、char,long,float等)

//

// 使用:1。定义一个CBBAdoConnection实例:CBBAdoConnection m_adoConn;

// 2。建立连接:m_adoConn.Open(strConnstring);

// 如果需要无条件重新连接的可以,参数bRepen设成TREU

// 3。打开记录集:

//

// _RecordsetPtr* prsThis=NULL;

// prsThis=new _RecordsetPtr;

// CString strSQL;

// strSQL="select * from Table_Name";//

// 如果记录集打开失败

//

if(!(m_adoConn.OpenRecordset(strSQL,prsThis)))

// return FALSE;

// 4。建立记录集值对象

// 注意需要用参数构造

// CBBRstValues rsv(m_adoConn,prsThis);

//

// 5。获得的字段的值

// rsv.GetValueLong(&m_nDeptID,1L);//获得第一个字段的值

// rsv.GetValueStr(m_strName,"ID");//获得第一个字段名为ID的值

// 其它的同理.如果需要获得SQL Server中nText类型的字段值请用

// GetValText(CString &strText, CString &strFieldName)函数

// 6。记录集的记录移动 (*prsThis)->MoveNext()等类似函数

// 7。记录集不用时候需要释放其资源

// 1)关闭记录集

// 2)删除记录集指针

// e.g. (*prsThis)->Close();

// delete prsThis;

// prsThis=NULL;

// 否则会造成内存泄漏

//

// 注:

// 1。程序必须要初始化COM环境,请在应用类中加入AfxOleInit函数初始化环境,否则ADO的调用将失败

// 2。如果需要调用存储过程SQL语句改为“Exec ” + 存储过程名即可,与执行SQL同样

//

// CopyRight seesi,2001

//

// 说明:你可以随便在的程序中任意使用、修改本代码,但请你不要删除文件头的部分说明。如果需要转载,请注明出处。

// msado15.dll必须放在本文件所在目录,或者自己指定下面的msado15.dll全路径

//

#if !defined(__AFXADO_H)

#import "msado15.dll" no_namespace rename ("EOF", "adoEOF") rename ("LockTypeEnum", "adoLockTypeEnum") rename ("DataTypeEnum", "adoDataTypeEnum") rename ("FieldAttributeEnum",

"adoFieldAttributeEnum") rename ("EditModeEnum", "adoEditModeEnum") rename ("RecordStatusEnum", "adoRecordStatusEnum")

rename ("ParameterDirectionEnum",

"adoParameterDirectionEnum")

#endif // !defined(__AFXADO_H)

class CBBAdoConnection

{

public:

CBBAdoConnection();

virtual ~CBBAdoConnection();

public:

int SetConnTimeOut(long lTimeOut); // 设置连接超时

int SetCommTimeOut(long lTimeOut); // 设置命令执行超时

BOOL IsConnectClose(); // 判断连接是否已经打开

int ExecuteSQL(LPCSTR szSQL); // 简单执行SQL语句,不返回记录集

// 打开数据库记录集

// 参数:

// strSQL 记录集的SQL语句

// rs 返回的记录集_RecordsetPtr对象

// sConnString 数据库的连接字符串

// 如果使用数据库连接已经打开,参数没用

// 如果数据库的连接没有打开,当给予一个连接字符串,将先打开数据库连接

BOOL OpenRecordset(CString strSQL, _RecordsetPtr *rs,CString sConnString="");//打开数据库记录集

BOOL OpenRecordset(const char *sSQL,_RecordsetPtr* rs,char* sConnString=NULL);

// 打开数据库连接

// 参数:

// strConnString 连接字符串

// sConnString 连接字符串

// bReOpen 是否重新打开,如果为FALSE,,

// 将先判断数据库是否打开如果没有打开则打开,

// 如果已经打开,将不执行任何操作

// 如果为TRUE,则无条件重新打开。

BOOL OpenConnection(CString strConnString ,BOOL bReOpen=FALSE);

BOOL OpenConnection(char* sConnString,BOOL bReOpen=FALSE); void CloseConnect();// 关闭数据库连接

BOOL ExecuteTrans(CStringArray arrStrSQL); // 事务处理,不返回任何记录集,参数为事务SQL数组

_ConnectionPtr* GetConnection(); // 得到_ConnectionPtr指针

CString GetConnString(); // 得到连接字符串

private:

enum ERRORFrom {

ErrFormOpenConnsction,

ErrFromOpenRecordset,

ErrFormCloseConnection,

ErrFormTanslation

};

_ConnectionPtr* m_pConn;

char m_szConnString[512];

///

protected:

void ReportError(int nERRORfrom);

};

class CBBRstValues

{

public:

// 三种构造类的方法

// 如果无参数构造,请构造后调用InitConnectAndRst方法

// 其他的两种构造则不需调用InitConnectAndRst方法

CBBRstValues();

CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs);

CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr*

pRs);

virtual ~CBBRstValues();

public:

// 初始化连接队象和记录集对象

void InitConnectAndRst(_ConnectionPtr* pConn,_RecordsetPtr* pRs);

void InitConnectAndRst(CBBAdoConnection* pBBAdoConn, _RecordsetPtr * Rs);

// GetValText函数

// 得到数据库nText字段的值

// 参数:

// strText 用来接收返回值(字段值)

// strFieldName 字段名,该字段数据类型必须是nText类型

BOOL GetValText(CString& strText,CString& strFieldName); //得到数据库nText字段的值

// GetValueStr函数

// 得到数字型,日期型和字符型字段值函数

// 参数:

// cVal 用来接收返回值(字段值)的字符串指针,要求要开辟足够的内存单元

// 或者足够容纳字段内容的字符数组。

// vIndex 数据库字段的名字或者索引,变体型,一般不直接用这个参数,

// 应该用同形式的多态函数的参数调用

// 数据库字段的数据类型可以是数字型,日期型和字符型

// nFieldLen 需要返回的数据的字符串的长度,如果为-1,则返回整个字段值

// lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型

// nFieldIndex 在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

// GetValueLong函数

// 得到数字型,日期型和字符型字段值函数

// 参数:

// lVal 用来接收返回值(字段值)

// vIndex 数据库字段的名字或者索引,变体型,一般不直接用这个参数,

// 应该用同形式的多态函数的参数调用

// 数据库字段的数据类型要求是数字型(int,long)

// lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型

// nFieldIndex 在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

// GetValueFlaot函数

// 得到数字型,日期型和字符型字段值函数

// 参数:

// fVal 用来接收返回值(字段值)

// vIndex 数据库字段的名字或者索引,变体型,一般不直接用这个参数,

// 应该用同形式的多态函数的参数调用

// 数据库字段的数据类型要求是字型(int,long,float,货币型等)

// lpszFieldName 字段名,数据库字段的数据类型可以是数字型,日期型和字符型

// nFieldIndex 在SQL语句中字段的索引序号数据库字段的数据类型可以是数字型,日期型和字符型

BOOL GetValueStr(char* cVal,_variant_t &vIndex,int

nFieldLen=-1);

BOOL GetValueLong(long* lVal,_variant_t &vIndex);

BOOL GetValueFloat(float* fVal,_variant_t &vIndex);

BOOL GetValueStr(char* cVal,long lIndex,int nFieldLen=-1);

BOOL GetValueLong(long* lVal,long lIndex);

BOOL GetValueFloat(float* fVal,long lIndex);

BOOL GetValueStr(char* cVal,CString strIndex,int nFieldLen=-1);

GetValueLong(long *lVal, LPCSTR lpszIndex);

BOOL GetValueFloat(float* fVal,CString strIndex);

BOOL GetValueStr(CString& str,LPCSTR lpszFieldName,int nFieldLen=-1);

BOOL GetValueStr(CString& str,UINT nFieldIndex,int nFieldLen=-1);

BOOL GetValueStr(CString& str,_variant_t &vIndex,int nFieldLen=-1);

// 判断值是否有效,是否为NULL

BOOL VerifyVTData(_variant_t& value);

BOOL VerifyVTData(char* pData);

protected:

_RecordsetPtr* m_prsThis;

_ConnectionPtr* m_pConn;

void ReportError();

};

#endif // _BBADOCONNECT_H

////CPP文件

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CBBAdoConnection::CBBAdoConnection()

{

m_pConn=NULL;

}

_ConnectionPtr* CBBAdoConnection::GetConnection()

{

return m_pConn;

}

CString CBBAdoConnection::GetConnString()

{

return m_szConnString;

}

CBBAdoConnection::~CBBAdoConnection()

{

// 关比连接

CloseConnect();

}

BOOL CBBAdoConnection::OpenConnection(char *sConnString,BOOL bReOpen /*=FALSE*/)

{

// 不需重新打开

if(!bReOpen)

{

if(m_pConn !=NULL && ((*m_pConn)->State!=adStateClosed))

return TRUE;

}

VERIFY(sConnString);

strcpy(m_szConnString,sConnString);

try

{

m_pConn =new _ConnectionPtr;

m_pConn->CreateInstance(__uuidof(Connection));

if(m_pConn==NULL)

return FALSE;

HRESULT hr=(*m_pConn)->Open((char*)sConnString,"","",-1);

if(FAILED(hr))

return FALSE;

return TRUE;

}

catch(_com_error)

{

ReportError(ErrFormOpenConnsction);

return FALSE;

}

catch(...)

{

#ifdef _DEBUG // 调试时显示相应的错误信息

MessageBox(NULL,"数据库连接未处理的异常!","连接失败",MB_OK|MB_ICONINFORMATION);

#else

MessageBox(NULL,"连接数据失败,请检查网络和数据库设置是否正确","连接失败",MB_OK|MB_ICONINFORMATION);

#endif

return FALSE;

}

SetConnTimeOut(5);

}

BOOL CBBAdoConnection::OpenRecordset(const char *sSQL, _RecordsetPtr *rs, char *sConnString)

{

// rs=new _RecordsetPtr;

VERIFY(sSQL);

try

{

if((m_pConn==NULL)||((*m_pConn)->State==adStateClosed))

{

int n=(*m_pConn)->State;

if(sConnString!=NULL)

{

if(!OpenConnection(sConnString))

return FALSE;

}

// 尝试连接数据库

else

{

//

// if(!OpenConnection(m_szConnString))

// return FALSE;

// MessageBox(NULL,"数据库连接已经断开,请重新连接!","连接问题",MB_OK|MB_ICONINFORMATION);

}

return FALSE;

}

// rs=new _RecordsetPtr;

HRESULT hr;

hr=rs->CreateInstance(__uuidof(Recordset));

if(FAILED(hr))

{

return FALSE;// 建立实例失败

}

hr=(*rs)->Open(sSQL,m_pConn->GetInterfacePtr(),

adOpenStatic, adLockBatchOptimistic, -1);

if(FAILED(hr))

{

return FALSE;// 打开连接失败

}

return TRUE;// 成功返回

}

catch(_com_error)

{

// AfxMessageBox(ce->Description());

ReportError(ErrFromOpenRecordset);

return FALSE;

}

catch(...)

{

MessageBox(NULL,"数据库记录打开失败!","记录失败",MB_OK|MB_ICONINFORMATION);

return FALSE;

}

return TRUE;

}

void CBBAdoConnection::CloseConnect()

{

try

{

if(m_pConn!=NULL)

{

if((*m_pConn)->State!=adStateClosed)

(*m_pConn)->Close();

delete m_pConn;

m_pConn=NULL;

}

}

catch(_com_error)

{

ReportError(ErrFormCloseConnection);

}

catch(...)

{

AfxMessageBox("关闭数据库连接未知错误!");

}

}

BOOL CBBAdoConnection::OpenConnection(CString strConnString, BOOL bReOpen)

{

char c[512];

strcpy(c,strConnString.GetBuffer(0));

strConnString.ReleaseBuffer();

return OpenConnection(c,bReOpen);

}

BOOL CBBAdoConnection::OpenRecordset(CString strSQL, _RecordsetPtr *rs, CString sConnString)

{

char c[1024];

strcpy(c,strSQL.GetBuffer(0));

strSQL.ReleaseBuffer();

return OpenRecordset(c,rs,(char*)(LPCTSTR)sConnString);

}

BOOL CBBAdoConnection::ExecuteTrans(CStringArray arrStrSQL) // 开始事务处理,不返回任何记录集,参数为事务SQL数组

{

(*m_pConn)->BeginTrans();

try

{

_RecordsetPtr* prsThis;

for(int i=0;i<arrStrSQL.GetSize();i++)

{

prsThis=new _RecordsetPtr;

OpenRecordset(arrStrSQL.ElementAt(i),prsThis);

delete prsThis;

}

prsThis=NULL;

(*m_pConn)->CommitTrans();

return TRUE;

}

catch(_com_error)

{

(*m_pConn)->RollbackTrans();

ReportError(ErrFormTanslation);

return FALSE;

}

}

// 执行SQL操作,不返回记录集

int CBBAdoConnection::ExecuteSQL(LPCSTR szSQL)

{

// VARIANT vEffect;

try

{

(*m_pConn)->Execute(szSQL,NULL,adCmdText|adExecuteNoRecords);

return TRUE;

}

catch(_com_error)

{

ReportError(ErrFormTanslation);

return FALSE;

}

// return vEffect.lVal;

}

// 返回是否处在连接状态

BOOL CBBAdoConnection::IsConnectClose()

{

return (m_pConn==NULL)||((*m_pConn)->State==adStateClosed);

}

// 设置连接超时

int CBBAdoConnection::SetConnTimeOut(long lTimeOut)

{

return (*m_pConn)->put_ConnectionTimeout(lTimeOut);

}

int CBBAdoConnection::SetCommTimeOut(long lTimeOut)

{

return (*m_pConn)->put_CommandTimeout(lTimeOut);

}

// 报告错误

void CBBAdoConnection::ReportError(int nERRORfrom)

{

switch(nERRORfrom)

{

case ErrFormOpenConnsction:

#ifdef _DEBUG // 调试试时显示相应的错误信息

try

{

for(long l=0;l<(*m_pConn)->Errors->Count;l++)

{

ErrorPtr pErr;

pErr=(*m_pConn)->Errors->GetItem(l);

CString str;

str=(char*)pErr->Description;

MessageBox(NULL,str,"连接失败",MB_OK|MB_ICONINFORMATION);

}

}

catch(...)

{

MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);

}

#else

MessageBox(NULL,"连接数据失败,请检查网络和数据库设置是否正确","连接失败",MB_OK|MB_ICONINFORMATION);

#endif

break;

case ErrFromOpenRecordset:

#ifdef _DEBUG

try

{

for(long i=0;i<(*m_pConn)->Errors->Count;i++)

{

ErrorPtr pErr;

pErr=(*m_pConn)->Errors->GetItem(i);

AfxMessageBox(pErr->Description);

}

}

catch(...)

{

MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);

}

#else

MessageBox(NULL,"打开数据库失败,请检查网络,并尝试重新连接数据库!","记录失败",MB_OK|MB_ICONINFORMATION);

#endif

break;

case ErrFormCloseConnection:

#ifdef _DEBUG // 调试时显示相应的错误信息

try

{

for(long l=0;l<(*m_pConn)->Errors->Count;l++)

{

ErrorPtr pErr;

pErr=(*m_pConn)->Errors->GetItem(l);

CString str;

str=(char*)pErr->Description;

MessageBox(NULL,str,"连接失败",MB_OK|MB_ICONINFORMATION);

}

}

catch(...)

{

MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);

}

#else

;// MessageBox(NULL,"关闭数据库连接异常","关闭异常",MB_OK|MB_ICONINFORMATION);

#endif

break;

case ErrFormTanslation:

#if def _DEBUG

try

{

for(long i=0;i<(*m_pConn)->Errors->Count;i++)

{

ErrorPtr pErr;

pErr=(*m_pConn)->Errors->GetItem(i);

AfxMessageBox(pErr->Description);

}

}

catch(...)

{

MessageBox(NULL,"数据库连接未知错误,无法捕捉具体错误信息!","错误",MB_ICONINFORMATION);

}

#else

MessageBox(NULL,"数据库执行任务失败,请检查数据库。","任务失败",MB_OK|MB_ICONINFORMATION);

#endif

break;

default:

break;

}

}

/////////////// CRecordsetValus

CBBRstValues::CBBRstValues()

{

;

}

CBBRstValues::CBBRstValues(_ConnectionPtr* pConn,_RecordsetPtr* pRs)

{

ASSERT(pConn);

ASSERT(pRs);

m_prsThis=pRs;

m_pConn=pConn;

}

CBBRstValues::CBBRstValues(CBBAdoConnection* pBBadoConn,_RecordsetPtr* pRs)

{

CBBRstValues(pBBadoConn->GetConnection(),pRs);

}

CBBRstValues::~CBBRstValues()

{

;

}

void CBBRstValues::InitConnectAndRst(_ConnectionPtr *pConn, _RecordsetPtr *pRs)

{

ASSERT(pConn);

ASSERT(pRs);

m_prsThis=pRs;

m_pConn=pConn;

}

void CBBRstValues::InitConnectAndRst(CBBAdoConnection *pBBAdoConn, _RecordsetPtr *pRs)

{

InitConnectAndRst(pBBAdoConn->GetConnection(),pRs);

}

BOOL CBBRstValues::GetValueLong(long *lVal, _variant_t &vIndex)

{

_variant_t value;

try{

if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)

{

#ifdef _DEBUG

AfxMessageBox("记录集未打开!");

#else

MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);

#endif

return FALSE;

}

if((*m_prsThis)->adoEOF)

{

lVal=0;

return FALSE;

}

value=(*m_prsThis)->GetCollect(vIndex);

}

catch(_com_error)

{

ReportError();

return FALSE;

}

catch(...)

{

AfxMessageBox("数据库字段访问未知错误!请检查数据库是否改动。",MB_ICONINFORMATION);

return FALSE;

}

if(VerifyVTData(value))

{

*lVal = long(value);

}

else

{

*lVal=0;

}

return TRUE;

}

BOOL CBBRstValues::GetValueStr(char *cVal, _variant_t &vIndex, int nFieldLen)

{

char * c=NULL;

_variant_t value;

DATE dt;

CString str;

COleDateTime da;

// 检查是数组

// VERIFY(sizeof(cVal)<1);

memset(cVal,0,sizeof(cVal));

try

{

if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)

{

#ifdef _DEBUG

AfxMessageBox("记录集未打开!");

#else

MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);

#endif

return FALSE;

}

if((*m_prsThis)->adoEOF)

{

cVal[0]='\0';

return FALSE;

}

value = (*m_prsThis)->GetCollect(vIndex);

}

catch(_com_error)

{

ReportError();

// AfxMessageBox("数据库字段访问错误!");

return FALSE;

}

catch(...)

{

AfxMessageBox("数据库字段访问未知错误!请检查数据库是否改动。",MB_ICONINFORMATION);

return FALSE;

}

if(VerifyVTData(value))

{

switch(value.vt)

{

case VT_BSTR:

c = (char *)_com_util::ConvertBSTRToString( V_BSTR(&value) );

if(VerifyVTData(c))

{

if(nFieldLen<=0)

{

strcpy(cVal,(char*)c);

}

else

{

strncpy(cVal, (char*)c, nFieldLen);

}

}

delete c;

c=NULL;

break;

case VT_I4:

case VT_DECIMAL:

case VT_UI4:

case VT_I8:

case VT_UI8:

case VT_INT:

case VT_UINT:

long lVal;

lVal = long(value);

ltoa(lVal,cVal,10);

break;

case VT_DATE:

dt=value.date;

da=COleDateTime(dt);

// str=da.Format("%Y-%m-%d %H:%M:%S");

str=da.Format("%Y-%m-%d ");

c=new char[64];

memset(c,0,sizeof(char)*64);

strcpy(c,str.GetBuffer(0));

str.ReleaseBuffer();

if(VerifyVTData(c))

{

if(nFieldLen<=0)

{

strcpy(cVal,(char*)c);

}

else

{

strncpy(cVal, (char*)c, nFieldLen);

cVal[nFieldLen]='\0';

}

}

delete c;

c=NULL;

break;

default:

#ifdef _DEBUG

AfxMessageBox("未处理的字段数据类型,请处理!");

#else

break;

#endif

break;

}

}

else

{

cVal[0]='\0';

}

return TRUE;

}

BOOL CBBRstValues::GetValueLong(long *lVal, long lIndex)

{

_variant_t vIndex(lIndex);

return GetValueLong(lVal,vIndex);

}

BOOL CBBRstValues::GetValueLong(long *lVal, LPCSTR lpszIndex)

{

_variant_t vIndex(lpszIndex);

return GetValueLong(lVal,vIndex);

}

BOOL CBBRstValues::VerifyVTData(char *pData)

{

if(pData == NULL)

{

return FALSE;

}

return TRUE;

}

BOOL CBBRstValues::VerifyVTData(_variant_t &value)

{

if(value.vt == VT_NULL)

{

return FALSE;

}

return TRUE;

}

BOOL CBBRstValues::GetValueStr(CString& str,LPCSTR lpszFieldName,int nFieldLen/*=-1*/)

{

_variant_t vIndex(lpszFieldName);

return GetValueStr(str,vIndex,nFieldLen);

}

BOOL CBBRstValues::GetValueStr(CString& str,UINT nFieldIndex,int nFieldLen/*=-1*/)

{

_variant_t vIndex((long)nFieldIndex);

return GetValueStr(str,vIndex,nFieldLen);

}

BOOL CBBRstValues::GetValueStr(CString& str,_variant_t &vIndex,int nFieldLen/*=-1*/)

{

TCHAR buffer[1024];

if(nFieldLen > 1023)

nFieldLen = 1023;

BOOL bResult=GetValueStr((char*)buffer,vIndex,nFieldLen);

str.Format(buffer);

str.TrimRight();

return bResult;

}

BOOL CBBRstValues::GetValueFloat(float* fVal,_variant_t &vIndex)

{

_variant_t value;

try

{

if((*m_prsThis)==NULL||(*m_prsThis)->State==adStateClosed)

{

#ifdef _DEBUG

AfxMessageBox("记录集未打开!");

#else

MessageBox(NULL,"无法读取数据库资料,可能数据库连接已经断开,请重新连接、然后重试。","连接问题",MB_ICONINFORMATION);

#endif

return FALSE;

}

if((*m_prsThis)->adoEOF)

{

fVal=0;

return FALSE;

}

value=(*m_prsThis)->GetCollect(vIndex);

}

catch(_com_error)

{

ReportError();

return FALSE;

}

catch(...)

{

AfxMessageBox("数据库字段访问未知错误!请检查连接数据库结构是否已经更改。",MB_ICONINFORMATION);

return FALSE;

}

if(VerifyVTData(value))

{

*fVal = float(value);

}

else

{

*fVal = 0;

}

return TRUE;

}

BOOL CBBRstValues::GetValueFloat(float* fVal,long lIndex)

{

_variant_t vIndex(lIndex);

return GetValueFloat(fVal,vIndex);

}

BOOL CBBRstValues::GetValueFloat(float* fVal,CString strIndex)

{

_variant_t vIndex(strIndex);

return GetValueFloat(fVal,vIndex);

}

BOOL CBBRstValues::GetValueStr(char *cVal,long lIndex,int nFieldLen)

{

_variant_t vIndex;

vIndex=_variant_t(lIndex);

return GetValueStr(cVal,vIndex);

}

BOOL CBBRstValues::GetValueStr(char *cVal,CString strIndex,int nFieldLen)

{

_variant_t vIndex;

vIndex=_variant_t(strIndex);

return GetValueStr(cVal,vIndex);

}

void CBBRstValues::ReportError()

{

#ifdef _DEBUG

try

{

for(long l=0;l<(*m_pConn)->Errors->Count;l++)

{

ErrorPtr pErr;

pErr=(*m_pConn)->Errors->GetItem(l);

AfxMessageBox(pErr->Description);

}

}

catch(...)

{

AfxMessageBox("字段错误对象访问错误,请检查书写是否正确。");

}

#else

MessageBox(NULL,"字段访问发生错误,请确认数据库结构没有改动。","字段访问",MB_ICONINFORMATION);

#endif

// AfxMessageBox("数据库字段访问错误!");

}

BOOL CBBRstValues::GetValText(CString &strText, CString &strFieldName)

{

_bstr_t varChunk;

_bstr_t varNotes;

long lngTotalsize,

lngOffSet = 0,

lngChunkSize = 100;

_variant_t vFieldName = _variant_t(strFieldName);

lngTotalsize = (*m_prsThis)->Fields->Item[vFieldName]->ActualSize/2;

if (lngTotalsize <= 0)

return FALSE;

try

{

while (lngOffSet < lngTotalsize)

{

varChunk = (*m_prsThis)->Fields->Item[vFieldName]->GetChunk(lngChunkSize);

varNotes = varNotes + varChunk;

lngOffSet = lngOffSet + lngChunkSize;

}

strText=(char*)varNotes;

}

catch(_com_error)

{

ReportError();

return FALSE;

}

catch(...)

{

#ifdef _DEBUG

AfxMessageBox("获取Text字段未知错误");

#endif

return FALSE;

}

return TRUE;

}

// 上面代码,还有没有完善的地方,更完善的代码,在以后会发表,现在我已经做成了一个DLL,并而还有一些示例文件,需要DLL和示例文件的,请与我联系。EMail: seesi@163.com

更多文章在我的个人主页:seesi.51.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有