11 数据库连接模型.docx

上传人:b****8 文档编号:30016239 上传时间:2023-08-04 格式:DOCX 页数:18 大小:236.35KB
下载 相关 举报
11 数据库连接模型.docx_第1页
第1页 / 共18页
11 数据库连接模型.docx_第2页
第2页 / 共18页
11 数据库连接模型.docx_第3页
第3页 / 共18页
11 数据库连接模型.docx_第4页
第4页 / 共18页
11 数据库连接模型.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

11 数据库连接模型.docx

《11 数据库连接模型.docx》由会员分享,可在线阅读,更多相关《11 数据库连接模型.docx(18页珍藏版)》请在冰豆网上搜索。

11 数据库连接模型.docx

11数据库连接模型

第十一节数据库连接模型

应用背景

数据库管理是最为广泛的应用之一,数据库应用程序设计是自动化系统中的一大领域,特别是伴随客户机/服务器数据库管理系统的出现,这种类型的应用越来越受到广大用户喜爱。

客户机是在工作站上运行的客户程序,工作站则与局域网络(LAN)或广域网络(WAN)上的服务器相连,构成客户机/服务器系统,其最主要的特点是所有由客户机应用程序发出的SQL语句都在服务器上执行,即服务器负责执行所有由工作站送入服务器的SQL语句。

例如从工作站上向服务器发出一个 Select 查询,则只有满足查询条件的记录被返回到客户工作站。

参见图11-1所示客户机/服务器结构,这种结构称C/S结构。

LAN/WAN

 

图11-1客户机/服务器结构

如果客户端使用浏览器Browser,而不是使用编写的客户端程序,那么由服务器端的目录服务器提供页面服务的程序设计,称为浏览器/服务器模式,即B/S模式。

这种模式的显著特点是客户端没有程序,客户端只有浏览器,所有程序都在服务器端运行,显然他避免了客户端程序的安装,减少了客户端程序的维护,增强了客户端服务程序的核心作用。

数据库连接模型就是适合以上所述两种软件开发模式的通用数据库联接模型,这里我们只介绍微软公司提供的ADO模型。

知识要点

(1)ADO模型

ActiveXDataObjects简称ADO,ADO是Microsoft提出的应用程序接口(API)用以实现访问关系数据库中的数据,也是Microsoft的组件对象模式(COM)的一部分,是微软最新的数据访问技术。

它被设计用来同新的数据访问层OLEDBProvider一起协同工作,以提供通用数据访问(UniversalDataAccess)。

OLEDB是一个低层的数据访问接口,用它可以访问各种数据源,包括传统的关系型数据库,以及电子邮件系统及自定义的商业对象。

ADO向我们提供了一个熟悉的,高层的对OLEDB的Automation封装接口。

ADO对象是OLEDB的接口,不同的数据源要求它们自己的OLEDB提供者(OLEDBprovider)。

目前,虽然OLEDB提供者比较少,但微软正积极推广该技术,并打算用OLEDB取代ODBC。

ADO的目标是访问、编辑和更新数据源,而编程模型体现了为完成该目标所必需的系列动作的顺序。

ADO可以完成的主要工作:

1.连接到数据源。

2.执行SQL命令。

3.返回结果集。

4.事物处理。

5.执行存储过程。

(2)VisualBasic6.0下建立数据库连接环境

VB程序大多情况下是使用ADO数据连接方式连接数据库。

VB集成环境的操作步骤:

工程-〉添加数据环境,在工程窗口中选择连接环境,在属性窗口中将连接环境名称更改为DE1,将数据连接对象名称更改为Conn。

在设计窗口中选择Conn对象,点击鼠标右健属性菜单,进行数据连接的设置,参见图11-2。

首先设置数据连接的驱动程序,我们选择连接MSSQLSERVER2K数据库,因此选用MicrosoftOLEDBProviderforSQLSERVER驱动。

图11-2数据连接-选择驱动程序

选择数据驱动后,选择数据库服务器名称或IP地址(运行数据库的机器名称),数据库用户名称和密码(与数据库连接的用户名或密码),以及在数据库服务器上选择需要连接的数据库(建立的数据库名称),最后进行测试连接,参见图11-3。

图11-3数据连接

点击测试连接成功画面如下:

图11-4测试成功

这个成功连接的数据环境,已经设置的属性包括:

连接字符串属性ConnectionSource:

用于设置连接数据库的要素,数据库驱动程序,网络上数据服务器名称或IP地址,数据库用户名和密码,以及需要连接的数据库名。

ConnectionSource=’Provider=SQLOLEDB.1;Password="";PersistSecurityInfo=True;UserID=sa;InitialCatalog=www;DataSource=beijing’

连接数据库时间限制ConnectionTimeout:

用于设置连接数据库的时间限制。

ConnectionTimeout=15

执行查询时间限制CommandTime:

用于设置执行数据库操作的时间限制。

CommandTime=30

连接数据方法Open:

用于连接数据库

DE1.Conn.Open

关闭数据方法Close:

用于关闭数据库

DE1.Conn.Close

(3)执行数据库SQL操作

在工程中数据连接环境同窗体一样,是全局量,因此我们可以在程序的任何位置使用这个环境来进行数据操作。

执行数据库操作SQL命令的基本形式如下:

DE1.Conn.ExecutestrSql

对于没有返回结果集的SQL命令,如Insert,Update,delete等SQL命令,执行SQL数据操作命令的基本方式为使用数据环境DE1的数据连接对象Conn的方法Execute直接执行。

SQL命令可以通过VB中的字符串连接方式构造。

例如:

strSql="insertintocustomer(cid,cname)values('kh01','liweimiao')"

DE1.Conn.ExecutestrSql

(4)获得数据库返回结果集

对于有返回结果集的SQL命令,如select语句,需要把结果集付给VB程序中的ADO对象的Recordset集类型变量,基本形式如下:

DimrstAsADODB.Recordset

Setrst=NewADODB.Recordset

DE1.Conn.Open

strSql="select*fromsetup"

rst.OpenstrSql,DE1.Conn,3,1

Recordset是一个数据查询结果集,对象部分方法解释如下:

Open方法用于返回查询结果集:

recordset.OpenSource,ActiveConnection,CursorType,LockType,Options

Source:

可选,SQL语句、表名、存储过程调用

ActiveConnection可选,有效Connection对象变量名。

CursorType可选,CursorTypeEnum值,确定提供者打开Recordset时应该使用的游标类型:

AdOpenForwardOnly(默认值)打开仅向前类型游标,AdOpenKeyset打开键集类型游标(常用),AdOpenDynamic打开动态类型游标(常用),AdOpenStatic打开静态类型游标。

LockType可选,确定提供者打开Recordset时应该使用的锁定(并发)类型的LockTypeEnum值,可为下列常量之一,AdLockReadOnly(默认值)只读,AdLockPessimistic保守式锁定—提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录,AdLockOptimistic开放式锁定—提供者使用开放式锁定,只在调用Update方法时才锁定记录,AdLockBatchOptimistic开放式批更新—用于批更新模式。

Options可选,长整型值,用于指示提供者如何计算Source参数。

可为下列常量之一,adCmdText指示提供者应该将Source作为命令的文本定义来计算,adCmdTable指示ADO生成SQL查询以便从在Source中命名的表中返回所有行,adCmdTableDirect指示提供者更改从在Source中命名的表中返回所有行,adCmdStoredProc指示提供者应该将Source视为存储过程,adCmdUnknown指示Source参数中的命令类型为未知,adCmdFile指示应从在Source中命名的文件中恢复保留(保存的)Recordset,adAsyncExecute指示应异步执行Source,adAsyncFetch指示在提取InitialFetchSize属性中指定的初始数量后,应该异步提取所有剩余的行。

如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用,adAsyncFetchNonBlocking指示主要线程在提取期间从未堵塞。

如果所请求的行尚未提取,当前行自动移到文件末尾。

Recordset对象属性及方法:

Move方法:

移动指针到Recordset对象的指定位置

MoveFirst方法:

移动指针到Recordset对象的第一条记录

MoveLast方法:

移动指针到Recordset对象的最后一条记录

MovePrevious方法:

移动指针到Recordset对象的上一条记录

MoveNext方法:

移动指针到Recordset对象的下一条记录

Recordset对象部分属性:

BOF属性:

判断当前Recordset对象的数据游标是否指向开始位置。

EOF属性:

判断当前Recordset对象的数据游标是否指向结尾位置。

RecordCount属性:

判断当前Recordset对象中的记录条数。

PageSize属性:

设定结果集的中每页显示的记录数量。

AbsolutePage:

返回结果集中的当前页码。

PageCount属性:

返回结果集的页面数量。

(5)事务处理操作

Connection连接对象能够完成事务处理功能,典型的事务处理包括:

BeginTrans方法:

事务处理开始,代表一系列事务处理开始

CommitTrans方法:

事务处理执行,将已经执行的动作在服务器上确认。

RollbackTrans方法:

事务回滚处理,将已经执行的动作取消,返回到事务处理前的状态。

(6)执行存储过程

Connection连接对象能够执行存储过程,基本形式就跟执行SQL命令一样,典型的语句形式如下:

strSql1="execp2"

DE1.Conn.ExecutestrSql1

应用举例:

例1:

根据建立的某销售公司销售数据库,使用VisualBasic6.0建立客户信息维护应用程序。

1.建立标准应用程序project1项目,在项目中添加窗体Form1,Form2,模块module1,数据连接环境DE1,参见图11-5,客户数据维护程序project1。

图11-5客户数据维护程序

2.完成数据连接。

点击数据连接环境中的conn对象,点击右键选择属性,进行数据连接的属性设置,参见图11-6选择连接数据库驱动程序,MicrosoftOleDBProviderforSQLServer作为驱动程序。

图11-6选择连接数据库驱动程序

参见图11-7,选择数据库服务器Beijing,选择用户名sa,密码为空,允许保存密码,允许密码为空,选择数据库WWW,测试连接成功。

图11-7选择数据库连接服务器,用户,密码,数据库

3.数据环境测试后,需要打开数据库。

设置程序的启动对象为SubMain()函数,并在该函数中打开数据库,并将Form1显示出来。

Submain()

DE1.Conn.Open

Form1.Show

EndSub

4.在窗体form1上添加4个命令按钮,分别为查询记录,添加记录,更改记录,删除记录,分别完成数据记录的查询,添加MSFlexGrid控件,用于表格形式显示数据记录,添加文本框控件text1用于输入查询条件,设计的窗体如下图11-8。

图11-8设计状态窗体Form1

5.在窗体Form2上添加一个框架frame1,添加6个输入数据的文本框Text1数组,添加标签,并添加命令按钮2个,分别完成数据确认和取消,涉及的窗体如下图11-9。

图11-9设计状态的窗体Form2

6.编写完成数据表格的初始化子程序,代码如下:

PrivateSubgrid()

MSFlexGrid1.Cols=6

MSFlexGrid1.AllowBigSelection=True

MSFlexGrid1.FillStyle=flexFillRepeat

MSFlexGrid1.Row=0

MSFlexGrid1.Col=0

MSFlexGrid1.Text="客户代码"

MSFlexGrid1.ColWidth(0)=MSFlexGrid1.Width/6

MSFlexGrid1.Col=1

MSFlexGrid1.Text="客户名称"

MSFlexGrid1.ColWidth

(1)=MSFlexGrid1.Width/6

MSFlexGrid1.Col=2

MSFlexGrid1.Text="电话"

MSFlexGrid1.ColWidth

(2)=MSFlexGrid1.Width/6-100

MSFlexGrid1.Col=3

MSFlexGrid1.Text="手机"

MSFlexGrid1.ColWidth(3)=MSFlexGrid1.Width/12

MSFlexGrid1.Col=4

MSFlexGrid1.Text="地址"

MSFlexGrid1.ColWidth(4)=MSFlexGrid1.Width/3

MSFlexGrid1.Col=5

MSFlexGrid1.Text="邮编"

MSFlexGrid1.ColWidth(5)=MSFlexGrid1.Width/12

EndSub

7.编写查询查询子程序,代码如下:

PrivateSubCommand1_Click()

DimiAsLong

DimstrsqlAsString

DimrstAsADODB.Recordset

Setrst=NewADODB.Recordset

strsql="select*fromcustomerwherecidlike'"+Text1.Text+"%'orcnamelike'"+Text1.Text+"%'"

rst.Openstrsql,DE1.Conn,adOpenKeyset,adLockReadOnly

Ifrst.RecordCount<>0Then

MSFlexGrid1.Rows=rst.RecordCount+1

Fori=1Torst.RecordCount

MSFlexGrid1.Row=i

MSFlexGrid1.Col=0

MSFlexGrid1.Text=rst.Fields("cid").Value

MSFlexGrid1.Col=1

MSFlexGrid1.Text=rst.Fields("cname").Value

MSFlexGrid1.Col=2

MSFlexGrid1.Text=IIf(IsNull(rst.Fields("ctel").Value),"",rst.Fields("ctel").Value)

MSFlexGrid1.Col=3

MSFlexGrid1.Text=IIf(IsNull(rst.Fields("cmobile").Value),"",rst.Fields("cmobile").Value)

MSFlexGrid1.Col=4

MSFlexGrid1.Text=IIf(IsNull(rst.Fields("caddr").Value),"",rst.Fields("caddr").Value)

MSFlexGrid1.Col=5

MSFlexGrid1.Text=IIf(IsNull(rst.Fields("czip").Value),"",rst.Fields("czip").Value)

rst.MoveNext

Nexti

Else

MSFlexGrid1.Cols=1

EndIf

EndSub

8.编写窗体的加载子程序,调用初始化表格,查询数据列表子程序,代码如下:

PrivateSubForm_Load()

grid

Command1_Click

EndSub

9.编写表格选择数据记录子程序,设置一个窗体变量cid,并编写数据记录选择子程序,代码如下:

OptionExplicit

DimcidAsString

PrivateSubMSFlexGrid1_Click()

IfMSFlexGrid1.Row>0Then

MSFlexGrid1.Col=0

cid=MSFlexGrid1.Text

EndIf

EndSub

10.窗体Form2的程序,在Form2代码中,增加一个窗体变量cid,用于判断是添加记录行为还是编辑记录行为。

窗体2的代码如下:

OptionExplicit

PubliccidAsString

DimstrsqlAsString

PrivateSubCommand1_Click()

DimrstAsADODB.Recordset

Setrst=NewADODB.Recordset

Ifcid<>""Then

Text1(0).Enabled=False

strsql="updatecustomersetcname='"+Text1

(1).Text+"'"

strsql=strsql+",ctel='"+Text1

(2).Text+"'"

strsql=strsql+",ctel='"+Text1(3).Text+"'"

strsql=strsql+",ctel='"+Text1(4).Text+"'"

strsql=strsql+",ctel='"+Text1(5).Text+"'"

strsql=strsql+"wherecid='"+Text1(0).Text+"'"

Else

strsql="insertintocustomer(cid,cname,ctel,cmobile,caddr,czip)values('"+Text1(0).Text+"'"

strsql=strsql+",'"+Text1

(1).Text+"'"

strsql=strsql+",'"+Text1

(2).Text+"'"

strsql=strsql+",'"+Text1(3).Text+"'"

strsql=strsql+",'"+Text1(4).Text+"'"

strsql=strsql+",'"+Text1(5).Text+"')"

EndIf

IfText1(0).Text=""OrText1

(1).Text=""Then

MsgBox"客户代码或客户名称不能为空",vbOKOnly

ExitSub

EndIf

Ifcid<>""Then

strsql="select*fromcustomerwherecid='"+Text1(0).Text+"'"

rst.Openstrsql,DE1.Conn,adOpenKeyset,adLockReadOnly

Ifrst.RecordCount<>0Then

MsgBox"客户代码重复!

",vbOKOnly

ExitSub

EndIf

EndIf

DE1.Conn.Executestrsql

Hide

UnloadMe

EndSub

PrivateSubCommand2_Click()

Hide

UnloadMe

EndSub

PrivateSubForm_Activate()

DimrstAsADODB.Recordset

Setrst=NewADODB.Recordset

Ifcid<>""Then

strsql="select*fromcustomerwherecid='"+cid+"'"

rst.Openstrsql,DE1.Conn,adOpenKeyset,adLockReadOnly

Ifrst.RecordCount<>0Then

Text1(0).Text=rst.Fields("cid").Value

Text1

(1).Text=rst.Fields("cname").Value

Text1

(2).Text=IIf(IsNull(rst.Fields("ctel").Value),"",rst.Fields("ctel").Value)

Text1(3).Text=IIf(IsNull(rst.Fields("cmobile").Value),"",rst.Fields("cmobile").Value)

Text1(4).Text=IIf(IsNull(rst.Fields("caddr").Value),"",rst.Fields("caddr").Value)

Text1(5).Text=IIf(IsNull(rst.Fields("czip").Value),"",rst.Fields("czip").Value)

EndIf

EndIf

EndSub

PrivateSubForm_Load()

Me.Left=(Screen.Width-Me.Width)/2

Me.Top=(Screen.Height-Me.Height)/2

 

EndSub

11.编写窗体Form1上的添加记录,编辑记录和删除记录的子程序,如下:

PrivateSubCommand3_Click()‘添加记录

LoadForm2

Form2.cid=""

Form2.ShowvbModal

Command1_Click

EndSub

PrivateSubCommand4_Click()‘编辑

LoadForm2

Form2.cid=cid

Form2.ShowvbModal

Command1_Click

EndSub

PrivateSubCommand5_Click()‘删除

DimresAsInteger

DimstrsqlAsString

Ifcid<>""Then

res=MsgBox("删掉客户代码为"+cid+"的客户信息吗?

",vbOKCancel)

Ifres=vbOKThen

strsql="deletefromcustomerwherecid='

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1