《vc++中用ado对数据访问层进行封装》由会员分享,可在线阅读,更多相关《vc++中用ado对数据访问层进行封装(12页珍藏版)》请在金锄头文库上搜索。
1、数据访问层的封装1. 总体架构模型 2. 数据访问层接口设计 3. 数据访问层实现 4. 自测题 5. 应用测试样例数据访问层的封装AdministratorATL.dllTellerATL.dllBusiness.dlldataAccess.dllmsado15.dllSQL Server 2005服务器管理BranchODBC Driver Manager (ODBC32.DLL)Web系统管理员应用界面Web出纳应用模块界面Web银行管理信息系统用户层主界面数据访问层业务逻辑层用户层统一数据访问接口数据库服务器实例数据库转换层1. 总体架构模型数据访问层的封装2. 数据访问层接口设计#i
2、nclude “SQLBaseStruct.h“ #ifdef DLL_FILE class _declspec ( dllexport ) ADOConn #else class _declspec ( dllimport ) ADOConn #endif private: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; public:ADOConn( ); virtual ADOConn(); void OnInitADOConn( char *username, char *password); void OpenRec
3、ordSet(_bstr_t bstrSQL, int type); void CloseRecordSet(); void ExitConnect();bool GetFirstBranchRecord(BranchStru bool GetNextBranchRecord(BranchStru void UpdateBranchRecord(BranchStru ; #endif ADOConn.h数据访问层的封装#import “c:Program FilesCommon FilesSystemadomsado15.dll“ no_namespace rename(“EOF“,“adoE
4、OF“) rename(“BOF“,“adoBOF“)#if !defined (AFX_ADOCONN_H_3B6FF8B9_09C7_4A94_9057_0F72457E4B86_INCLUDED_) #define AFX_ADOCONN_H_3B6FF8B9_09C7_4A94_9057_0F72457E4B86_INCLUDED_#if _MSC_VER 1000 #pragma once #endif / _MSC_VER 10002. 数据访问层接口设计ADOConn.h数据访问层的封装2. 数据访问层接口设计#ifndef INC_ATTR#define INC_ATTRtyp
5、edef struct BranchStruchar branch_name52;char city22;float assets; BranchStru;#define TABLE0X04 #define QUERY0X05 #define EXISTED0X06 #define DISACCORD0X07 #define OK0x08#endif数据访问层的封装3. 数据访问层实现#ifndef DLL_FILE #define DLL_FILE #endif#include “ADOConn.h“ #include “stdio.h“ #include “SQLBaseStruct.h“
6、ADOConn.cpp数据访问层的封装ADOConn:ADOConn() ADOConn:ADOConn() void ADOConn:OnInitADOConn( char *username, char *password) :CoInitialize(NULL); trychar conn100; sprintf(conn,“DSN=Branch; UID=%s; PWD=%s;“,username,password); m_pConnection.CreateInstance(“ADODB.Connection“); _bstr_t strConnect = conn; m_pConn
7、ection-Open(strConnect,“,“,adModeUnknown); catch (_com_error 3. 数据访问层实现ADOConn.cpp数据访问层的封装void ADOConn:OpenRecordSet(_bstr_t bstrSQL, int type) CoInitialize(NULL);try m_pRecordset.CreateInstance(“ADODB.Recordset“);_variant_t vtFirstName;switch (type) case TABLE:m_pRecordset-Open(_variant_t(bstrSQL),
8、_variant_t(IDispatch *) m_pConnection, true),adOpenStatic, adLockOptimistic, adCmdTable); break; case QUERY:m_pRecordset-Open(_variant_t(bstrSQL),_variant_t(IDispatch *) m_pConnection, true),adOpenStatic, adLockOptimistic, adCmdText); break;catch (_com_error :CoUninitialize(); 3. 数据访问层实现ADOConn.cpp数
9、据访问层的封装void ADOConn:CloseRecordSet() m_pRecordset-Close(); void ADOConn:ExitConnect() if (m_pRecordset != NULL) m_pRecordset-Close(); m_pConnection-Close(); :CoUninitialize(); 3. 数据访问层实现ADOConn.cpp数据访问层的封装bool ADOConn:GetFirstBranchRecord(BranchStru _variant_t vt;if (!m_pRecordset-adoEOF) vt = m_pRe
10、cordset-Fields-GetItem(long)0)-GetValue(); strcpy(p.branch_name,(char*) (_bstr_t)vt);vt = m_pRecordset-Fields-GetItem(long)1)-GetValue();strcpy(p.city, (_bstr_t)vt);vt = m_pRecordset-Fields-GetItem(long)2)-GetValue();p.assets = atof(char*)(_bstr_t)vt);return true;else return false; catch (_com_error
11、 :CoUninitialize(); 3. 数据访问层实现ADOConn.cpp数据访问层的封装(1) 完善下面两个接口函数的具体实现 bool ADOConn:GetNextBranchRecord(BranchStru a.OnInitADOConn(“try“,“738441242“); BranchStru p;char branch_name52; char sql150; printf(“input branch name:“); gets(branch_name); _bstr_t sqlQuery; sprintf(sql,“select * from branch where branch_name=%s“,branch_name); sqlQuery=sql; a.OpenRecordSet(sqlQuery,QUERY); if(a.GetFirstBranchRecord(p) printf(“%s ,%s ,%fn“,p.branch_name,p.city,p.assets); a.ExitConnect(); return 0; 5. 测试样例