一 关于初始化ADODB
需要在InitInstance()中首先调用AfxOleInit()对OLE进行初始化,之后要导入 c:\program files\common files\system\ado\msado15.dll,经过以上几步操作,接下来可以通过调用_ConnectionPtr和_RecordsetPtr来建立连接对象与记录集对象。为了简化编程,我封装了一个很简单的类库CDB,实现了对_ConnectionPtr的简单调用。
// DB.h: interface for the CDB class. // //////////////////////////////////////////////////////////////////////
#if !defined(__DB_H__) #define __DB_H__
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace \ rename("EOF", "adoEOF") \ rename("LockTypeEnum", "adoLockTypeEnum") \ rename("DataTypeEnum", "adoDataTypeEnum") #include "icrsint.h" inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); } inline BOOL IS_VT_NULL(unsigned short x) { return (x == VT_NULL ? TRUE : FALSE); }
class CDB { public: CDB(); virtual ~CDB(); _RecordsetPtr Exec(CString& strSql); void Close();
private: _ConnectionPtr m_Conn; };
class CSecUtil { public: static CString StrReplace(LPTSTR lpszString, LPTSTR lpszKey, LPTSTR lpszReplace); static BOOL StrCheck(LPCTSTR); };
#endif // !defined(__DB_H__)
// DB.cpp: implementation of the CDB class. // //////////////////////////////////////////////////////////////////////
#include "stdafx.h" #include "DB.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
////////////////////////////////////////////////////////////////////// // CDB Construction/Destruction //////////////////////////////////////////////////////////////////////
CDB::CDB() { try { m_Conn.CreateInstance(__uuidof(Connection)); // _bstr_t connstr = "driver={SQL Server};Server=127.0.0.1;DATABASE=;UID=;PWD="; // 针对mssql _bstr_t connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;user id=admin;jet oledb:database password="; // 针对ACCESS } catch(_com_error& e) { AfxMessageBox(e.Description()); } }
CDB::~CDB() { if(m_Conn->State) { m_Conn->Close(); } }
_RecordsetPtr CDB::Exec(CString& strSql) { _RecordsetPtr rs; try { rs = m_Conn->Execute((_bstr_t)strSql, NULL, adCmdText); } catch(_com_error& e) { AfxMessageBox(e.Description()); }
return rs; }
void CDB::Close() { if(m_Conn->State) { m_Conn->Close(); } }
使用时先按需要填充connstr,之后可以使用
CDB db;
建立一个对象,调用db.Exec来执行sql语句,其内部通过调用连接对象的Execute()方法来实现,Exec()方法调用后返回一个_RecordsetPtr的对象。调用db.close()关闭数据库。
二 类型转换 成功执行一次SELECT操作后从数据库中取出的记录保存在由_RecordsetPtr所定义的记录集对象中,通过调用GetCollect方法,可以将记录取出,如: CDB db; _RecordsetPtr rs; CString strSql; strSql = "SELECT id, user FROM logon"; rs = db.Exec(strSql); if(rs->EOF) ... else rs->GetCollect("id");
然而调用GetCollect()返回的类型为_variant_t(相关介绍见MSDN),需要将其转化成控件所支持得类型才能显示,当然这些数据的原始类型是由数据库字段的定义类型,可以通过判断结构中的vt这个变量来取出当前的数据类型。这个变量返回一个VARTYPE类型的值(见表1)。 以下列出的是针对ACCESS的字段类型的转换,MSSQL与ACCESS的字段类型相类似,大部分可以按照下面的方法对类型进行转换。
数字:rs->GetCollect("id").intVal; BYTE:rs->GetCollect("id").bVal; 文本/备注/时间:(char*)(_bstr_t)(rs->GetCollect("user")
这里要注意,对于数字类型,需要判断有无符号的情况。下面是VARIANT结构对于数据类型的定义。注释后面的为VARTYPE枚举类型。对于特定类型的转换可以通过查表1来进行操作,对于VARTYPE类型的定型可以以VARENUM为关键字在MSDN中搜索(我使用的是MSDN 2003 April)。 LONGLONG llval; // VT_I8. LONG lVal; // VT_I4. BYTE bVal; // VT_UI1. SHORT iVal; // VT_I2. FLOAT fltVal; // VT_R4. DOUBLE dblVal; // VT_R8. VARIANT_BOOL boolVal; // VT_BOOL. _VARIANT_BOOL bool; SCODE scode; // VT_ERROR. CY cyVal; // VT_CY. DATE date; // VT_DATE. BSTR bstrVal; // VT_BSTR. IUnknown * punkVal; // VT_UNKNOWN. IDispatch * pdispVal; // VT_DISPATCH. SAFEARRAY * parray; // VT_ARRAY|*. BYTE * pbVal; // VT_BYREF|VT_UI1. SHORT * piVal; // VT_BYREF|VT_I2. LONG * plVal; // VT_BYREF|VT_I4. LONGLONG * pllVal; // VT_BYREF|VT_I8. FLOAT * pfltVal; // VT_BYREF|VT_R4. DOUBLE &nbs [1] [2] 下一页 没有相关教程
|