数据访问层专题.ppt

上传人:wuy****n92 文档编号:88339155 上传时间:2023-04-25 格式:PPT 页数:63 大小:342.50KB
返回 下载 相关 举报
数据访问层专题.ppt_第1页
第1页 / 共63页
数据访问层专题.ppt_第2页
第2页 / 共63页
点击查看更多>>
资源描述

《数据访问层专题.ppt》由会员分享,可在线阅读,更多相关《数据访问层专题.ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第14讲 数据访问层专题从企业开发角度出发主讲人:李洪波1第14讲 数据访问层专题实验计划实现技术概念分析2第14讲 数据访问层专题实验计划实现技术概念分析31.数据访问层概念分析用户应用程序数据库客户端网络图1 单层体系结构 41.数据访问层概念分析图2 双层体系结构 用户应用程序数据库服务器客户端网络应用服务器51.数据访问层概念分析图3 三层体系结构表示层数据访问层业务逻辑层数据库61.数据访问层概念分析测试程序EXEDLLVisual C+2010SQL Server Management 2008 Express71.数据访问层概念分析测试程序ODBCSQL Server Manag

2、ement 2008 ExpressEXEDLLVisual C+2010ODBC32.DLL81.数据访问层概念分析测试程序SQL Server Management 2008 ExpressADOODBCEXEDLLVisual C+2010msado15.dllODBC32.DLL软构件91.数据访问层概念分析动态链接库ADO、ODBC动态SQL封装用户访问控制企业级应用技术的集成10第14讲 数据访问层专题实验计划实现技术概念分析112.实验计划实验任务运用VC动态链接库技术封装ADO访问数据库实验要求1.透彻理解数据访问层在数据库应用系统中的作用2.熟练运用企业实用技术数据访问层12

3、实验目标以此为范版直接扩展到企业实际项目开发中去2.实验计划实验方法1.依托商业银行数据库,按先简单再综合的次序展开。2.教师讲授学生自训相结合,讲授案例与自训案例分开。3.分组实验,设问与询问捕获问题并加以解决。4.人人提交源程序,抽样验收。内容与时间安排日期日期星期星期内容内容分工分工11.5三ADO应用简单样例与动态SQL教师主讲,学生自训11.7五数据库的增删改动态链接库封装数据访问层样例教师主讲,学生自训11.14五分组分案例封装数据访问层学生综合设计与调试11.19三分组分案例封装数据访问层教师逐组验收学生回答设问问题13第14讲 数据访问层专题实验计划实现技术概念分析143.数据

4、访问层的实现技术ADO的应用实例数据访问层的封装动态查询对数据库修改153.1简单的ADO应用实例样例功能描述:查询银行名称信息16(1)打开连接接 系统管理员(服务器管理员角色与Branch数据库管理员角色)连接到SQL server 2008 Management Express服务器的Branch数据库(2)打开Branch表(3)从查询结果记录集的第一条记录到最后一条记录逐条输出记录的branch_name属性值(4)关闭记录集(5)关闭连接算法的非形式化描述:3.1简单的ADO应用实例#import c:Program FilesCommon FilesSystemADOmsado1

5、5.dll no_namespace rename(EOF,EndOfFile)#include void main(void)CoInitialize(NULL);try _ConnectionPtr pConn(ADODB.Connection);_RecordsetPtr pRst(ADODB.Recordset);pConn-Open(DSN=Branch;UID=try;PWD=738441242;,adConnectUnspecified);pRst-Open(Branch,_variant_t(IDispatch*)pConn,true),adOpenStatic,adLockR

6、eadOnly,adCmdTable);_variant_t vtFirstName;pRst-MoveFirst();while(!pRst-EndOfFile)vtFirstName=pRst-Fields-GetItem(long)0)-GetValue();printf(First name=%sn,(char*)(_bstr_t)vtFirstName);pRst-MoveNext();getchar();pRst-Close();pConn-Close();catch(_com_error&e)printf(Description=%sn,(char*)e.Description(

7、);:CoUninitialize();173.1 简单的ADO应用实例#import c:Program FilesCommon FilesSystemADOmsado15.dll no_namespace rename(EOF,EndOfFile)#include void main(void)CoInitialize(NULL);try _ConnectionPtr pConn(ADODB.Connection);_RecordsetPtr pRst(ADODB.Recordset);pConn-Open(DSN=Branch;UID=try;PWD=738441242;,adConne

8、ctUnspecified);pRst-Open(Branch,_variant_t(IDispatch*)pConn,true),adOpenStatic,adLockReadOnly,adCmdTable);18HRESULT Open(const _variant _t&source,const _variant_t&connection,Enum cursorType,enum LockTypeEnum lockType,long options);3.1 简单的ADO应用实例 _variant_t vtFirstName;/bstr_t bstrQuery(select*from b

9、ranch);pRst-MoveFirst();while(!pRst-EndOfFile)vtFirstName=pRst-Fields-GetItem(long)0)-GetValue();printf(First name=%sn,(char*)(_bstr_t)vtFirstName);pRst-MoveNext();getchar();193.1 简单的ADO应用实例 rs-Close();pConn-Close();catch(_com_error&e)printf(Description=%sn,(char*)e.Description();:CoUninitialize();2

10、03.1 简单的ADO应用实例ADO Data-Bound ControlADO Data ControlOLE DB ProviderFor ODBC DriverOLE DB Native ProviderODBC Driver Manager(ODBC32.DLL)ODBC DriverDatabase图4-1 ADO连接数据库的两种方式213.1 简单的ADO应用实例1.创建一个到数据源的连接(Connection),并决定是否启用事务支持。2.创建一个命令对象(Command)对应一个命令。比如一个SQL命令。3.利用参数对象(Parameter)定义SQL命令所需的列、表、值之类的

11、变参。4.执行命令(Command,Connection或者Recordset)。5.如果命令返回的是行数据,则将数据存储在缓冲区中(Recordset)。6.创建一个视图来排序、过滤、浏览数据(Recordset)。7.通过添加、删除、改变行列操作来编辑数据(Recordset)。8.适当的时候,利用缓冲区中的数据更新数据源(Recordset)。9.如果使用了事务,接受或撤销完成事务期间所作的改变,并结束该事务。223.1 简单的ADO应用实例23创建数据源3.1 简单的ADO应用实例24创建数据源3.1 简单的ADO应用实例25创建数据源3.1 简单的ADO应用实例26创建数据源3.1

12、简单的ADO应用实例27创建数据源3.1 简单的ADO应用实例28创建数据源3.1 简单的ADO应用实例29创建数据源3.1 简单的ADO应用实例30创建数据源3.1 简单的ADO应用实例31创建数据源3.1 简单的ADO应用实例32创建数据源3.数据访问层的实现ADO的应用实例数据访问层的封装动态SQL对数据库修改333.2 动态SQLsprintf 是个变参函数,定义如下:int sprintf(char*buffer,const char*format,argument.);sprinf最重要的就是第二个参数,格式化字符串。sprinf不会检查第一个参数指向的缓冲是否可以容纳你要格式化的

13、字符串,printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量值来替代那个说明符,产生一个调用者想要 的字符串。sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。343.2 动态SQLsprintf 是个变参函数,定义如下:int sprintf(char*buffer,const char*format,argument.);sprinf最重要的就是第二

14、个参数,格式化字符串。sprinf不会检查第一个参数指向的缓冲是否可以容纳你要格式化的字符串,printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量值来替代那个说明符,产生一个调用者想要 的字符串。sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代itoa。353.2 动态SQLsprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能

15、够连接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如:char*who=I;char*whom=CSDN;sprintf(s,%s love%s.,who,whom);/产生:I love CSDN.连接字符串363.2 动态SQLchar branch_name52,city22;float assets;coutbranch_namecityassets;char sql200;连接字符串sprintf(sql,“select*from branch where branch_name=%s”

16、,branch_name)sprintf(sql,“select*from branch where branch_name=%s and city=%s and assets=%f”,branch_name,city,assets)373.2 动态SQL#import c:Program FilesCommon FilesSystemADOmsado15.dll no_namespace rename(EOF,EndOfFile)#include void main(void)CoInitialize(NULL);try _ConnectionPtr m_pConnection(ADODB.

17、Connection);_RecordsetPtr pRst(ADODB.Recordset);pConn-Open(DSN=Branch;UID=try;PWD=738441242;,adConnectUnspecified);383.2 动态SQL char branch_name52;char city22;float assets;char sql200;coutPlease input branch name:Open(SqlQuery,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockReadOnly,adCm

18、dText);393.2 动态SQL _variant_t vt;pRst-MoveFirst();while(!pRst-EndOfFile)vt=pRst-Fields-GetItem(long)0)-GetValue();coutBranch name=(char*)(_bstr_t)vt)Fields-GetItem(long)1)-GetValue();coutBranch name=(char*)(_bstr_t)vt)Fields-GetItem(long)2)-GetValue();coutBranch name=atof(char*)(_bstr_t)vt)MoveNext(

19、);403.2 动态SQL getchar();pRst-Close();m_pConnection-Close();catch(_com_error&e)printf(Description=%sn,(char*)e.Description();:CoUninitialize();41自训题目1.根据自身的银行数据库,编写基于ADO组件的查询银行名称、地址和总资产的应用程序。421.服务器用户和数据库用户设置好了吗?2.建立数据源了吗?3.如何输出数值型总资产数据呢呢?设问问题3.数据访问层的实现ADO的应用实例数据访问层的封装动态查询对数据库修改433.3 数据库修改HRESULT Ope

20、n(const _variant _t&source,const _variant_t&connection,enum cursorType,enum LockTypeEnum lockType,long options);打开记录集函数adOpenDynamic,adOpenForwardOnly,adOpenKeyset,adOpenStatic,adOpenUnspecified。adLockBatchOptimistic,adLockOptimistic,adLockpessimistic,adLockReadOnly,adLockUnspecified。adCmdUnspecifie

21、d,adCmdText,adCmdTable,adCmdStoredProc,adCmdUnknown,adCmdFile,adCmdTableDirect,adCmdURLBind。443.3 数据库修改-插入char bstrQuery50=branch;pRst-Open(_variant_t(bstrQuery),_variant_t(IDispatch*)m_pConnection,true),adOpenForwardOnly,adLockOptimistic,adCmdTable);pRst-AddNew();pRst-PutCollect(_variant_t(branch_n

22、ame),_variant_t(branch_name);pRst-PutCollect(_variant_t(city),_variant_t(city);pRst-PutCollect(_variant_t(assets),_variant_t(assets);pRst-Update();主要语句453.3 数据库修改-删除pRst-Open(SqlQuery,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);if(!pRst-EndOfFile)pRst-Delete(ad

23、AffectCurrent);主要语句463.3 数据库修改-更新variant_t vNull;vNull.vt=VT_ERROR;vNull.scode=DISP_E_PARAMNOTFOUND;pRst-PutRefActiveConnection(m_pConnection);pRst-Open(_variant_t(bstrQuery),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText);if(!pRst-EndOfFile)pRst-PutCollect(_variant_t(_T(assets),_variant_t(asset

24、s);pRst-Update();主要语句473.3 数据库修改根据以前所学和本节课所讲,实现自身数据库表branch的增删改课堂训练483.数据访问层的实现ADO的应用实例数据访问层的封装动态查询对数据库修改493.4 数据访问层的封装1.数据访问层接口设计2.数据访问层实现3.自测题4.应用测试样例50数据访问层接口设计#include SQLBaseStruct.h#ifdef DLL_FILEclass _declspec(dllexport)ADOConn#elseclass _declspec(dllimport)ADOConn#endifprivate:_ConnectionPt

25、r m_pConnection;_RecordsetPtr m_pRecordset;public:ADOConn();virtual ADOConn();void OnInitADOConn(char*username,char*password);void OpenRecordSet(_bstr_t bstrSQL,int type);void CloseRecordSet();void ExitConnect();bool GetFirstBranchRecord(BranchStru&p);bool GetNextBranchRecord(BranchStru&p);void Upda

26、teBranchRecord(BranchStru&p);#endif ADOConn.h51数据访问层接口设计#import c:Program FilesCommon FilesSystemadomsado15.dll no_namespace rename(EOF,adoEOF)rename(BOF,adoBOF)#if!defined(AFX_ADOCONN_H_3B6FF8B9_09C7_4A94_9057_0F72457E4B86_INCLUDED_)#define AFX_ADOCONN_H_3B6FF8B9_09C7_4A94_9057_0F72457E4B86_INCLUDE

27、D_#if _MSC_VER 1000#pragma once#endif/_MSC_VER 1000ADOConn.h52数据访问层接口设计#ifndef INC_ATTR#define INC_ATTRtypedef struct BranchStru char branch_name52;char city22;float assets;BranchStru;#define TABLE0X04#define QUERY0X05#define EXISTED0X06#define DISACCORD0X07#define OK0 x08#endif53 数据访问层的实现#ifndef DL

28、L_FILE#define DLL_FILE#endif#include ADOConn.h#include stdio.h#include SQLBaseStruct.hADOConn.cpp54 数据访问层的实现ADOConn:ADOConn()ADOConn:ADOConn()void ADOConn:OnInitADOConn(char*username,char*password):CoInitialize(NULL);try char conn100;sprintf(conn,DSN=Branch;UID=%s;PWD=%s;,username,password);m_pConne

29、ction.CreateInstance(ADODB.Connection);_bstr_t strConnect=conn;m_pConnection-Open(strConnect,adModeUnknown);catch(_com_error&e)printf(Description=%sn,(char*)e.Description();ADOConn.cpp55 数据访问层的实现void ADOConn:OpenRecordSet(_bstr_t bstrSQL,int type)CoInitialize(NULL);try m_pRecordset.CreateInstance(AD

30、ODB.Recordset);_variant_t vtFirstName;switch(type)case TABLE:m_pRecordset-Open(_variant_t(bstrSQL),_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,adLockO

31、ptimistic,adCmdText);break;catch(_com_error&e)printf(Description=%sn,(char*)e.Description();:CoUninitialize();ADOConn.cpp56 数据访问层的实现void ADOConn:CloseRecordSet()m_pRecordset-Close();void ADOConn:ExitConnect()if(m_pRecordset!=NULL)m_pRecordset-Close();m_pConnection-Close();:CoUninitialize();ADOConn.c

32、pp57 数据访问层的实现bool ADOConn:GetFirstBranchRecord(BranchStru&p)try m_pRecordset-MoveFirst();_variant_t vt;if(!m_pRecordset-adoEOF)vt=m_pRecordset-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_

33、pRecordset-Fields-GetItem(long)2)-GetValue();p.assets=atof(char*)(_bstr_t)vt);return true;else return false;catch(_com_error&e)printf(Description=%sn,(char*)e.Description();:CoUninitialize();ADOConn.cpp58 数据访问层自训题(1)完善下面两个接口函数的具体实现bool ADOConn:GetNextBranchRecord(BranchStru&p)void ADOConn:UpdateBran

34、chRecord(BranchStru&p)(2)编写一个控制台应用程序,实现查询满足指定条件的记录并在屏幕上输出;实现满足指定条件记录的更新,并显示更新前后的记录。59 数据访问层的测试样例#include data.h#include stdio.h#include SQLBaseStruct.h#pragma comment(lib,dataAccessBranch.lib)int main()ADOConn a;a.OnInitADOConn(try,738441242);BranchStru p;char branch_name52;char sql150;printf(input

35、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;60数据访问层的自训题参考答案(1)完善下面两个接口函数的具体实现bool AD

36、OConn:GetNextBranchRecord(BranchStru&p)try m_pRecordset-MoveNext();_variant_t vt;if(!m_pRecordset-adoEOF)vt=m_pRecordset-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-GetI

37、tem(long)2)-GetValue();p.assets=atof(char*)(_bstr_t)vt);return true;else return false;catch(_com_error&e)printf(Description=%sn,(char*)e.Description();:CoUninitialize();61数据访问层的自训题参考答案(1)完善下面两个接口函数的具体实现void ADOConn:UpdateBranchRecord(BranchStru&p)_variant_t vt;vt=(_variant_t)(_bstr_t)p.branch_name);

38、m_pRecordset-Fields-GetItem(long)0)-PutValue(vt);vt=(_variant_t)(_bstr_t)p.city);m_pRecordset-Fields-GetItem(long)1)-Value=vt;vt=(_variant_t)(_bstr_t)p.assets);m_pRecordset-Fields-GetItem(long)2)-Value=vt;m_pRecordset-Update(vtMissing,vtMissing);62数据访问层的自训题参考答案(2)编写一个控制台应用程序,实现查询满足指定条件的记录并在屏幕上输出;实现满足指定条件记录的更新,并显示更新前后的记录。63

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁