VB数据库编程Word文档格式.docx
《VB数据库编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《VB数据库编程Word文档格式.docx(65页珍藏版)》请在冰豆网上搜索。
定货客户号日期内容数量
1476433912/23/9427$22.95
1493233913/17/9446$9.57
1510887652/15/9627$22.95
在这个表中,客户号字段引用了客户表中的客户号字段,从而把定单和客户联系起来了。
可以看到,客户3391(MarySmith)在94年2月23日订购了27项,在94年3月17日订购了46项。
用来建立关系的键叫做外部键,因为它与“外部”表(客户表)的主键关联。
一对多和多对多关系上表中的关系类型叫做一对多关系,因为一个客户可以发出多个定单,而某个特定的定单只能是一个客户所发。
也可以建立多对多的关系。
例如,列出所有可以销售的项(存货)的盘存表:
表3盘存表
内容描述供应商费用盘存
27StrawHatGardenSupplyCo.$14.0050
46GardenglovesGardenSupplyCo.$4.5075
102hangingfloralindustries$6.00137
从盘存表中,可以看到在客户和存货项之间存在多对多的关系。
也就是说,一个客户可以订购多个存货项,而一个存货项又能够被多个客户订购。
多对多关系是通过两个独立的一对多关系来定义的,公共的“多”表包含了两个其它表的外部键。
在该例中,定货s表与盘存表(通过“内容”)与Customer表(通过客户号)都相关联。
通过这三个表,我们可以看到,MarySmith(客户号3391)订购了StrawHat(“内容”27)和GardenGloves(“内容”46),而MarySmith(客户号3391)和MortimerBlaselflatz(客户号8765)都订购了StrawHat(“内容”27)。
如果把客户表和盘存表的相关字段与定货表的“定货”字段联结起来,建立一个“关联”表,那么这个关系就更清楚了。
表4关联表:
按客户号和内容排序
定货号客户号姓名内容描述
1476433391SmithMary27StrawHat
1493233391SmithMary46GardenGloves
151688765BlaselfatzMortimer27StrawHat
规范化数据库设计者的任务就是组织数据,而组织数据的方法,应能消除不必要的重复,并为所有必要信息提供快速查找路径。
为了达到这种目标而把信息分离到各种独立的表中去的过程,叫作规范化。
规范化是用许多指定的规则和不同级别的范式来进行规范的复杂过程。
该过程的研讨已超出了本文的范围。
但是,大多数简单数据库的规范化可以用下面简单的经验规则来完成:
包含重复信息的表必须分成独立的几个表来消除重复。
例如,使学生和课程对应的学生数据库,包含了下表所示的信息。
表5
学生课程描述教授
14IntroductiontoPhysiologyDawson
23AppliedBasketweaingCarruth
31PhysicsforShort-定货cooksAdms
42IntroductiontoPhysiologyDawsons
如果有选学了十二门课程的1000个学生,每门课程的说明和教师将显示100多次─对选了那门课程的每个学生都要重复一次。
要避免这种低效率,应当把表分成两个独立的表来规范化,一个用来表示学生,另一个用来表示课程,如表6,表7所示。
学生课程
14
23
31
44
课程描述教授
1PhysicsforShort-定货cooksAdms
2CountercultureSociologyBeckely
3AppliedBasketweaingCarruth
4IntroductiontoPhysiologyDawsons
VB数据库编程二
信息来源:
黑客代码编辑:
admin浏览次数:
211加入时间:
2010-3-3111:
49:
15评论(0)
VB数据库编程二
现在表被规范化了,所以,要改变特定课程的课程描述或“数据”,只要改变一个记录就可以了。
以上是关于数据库的基本知识,这是学习数据库编程所必须的。
虽然数据库技术作为一门学科,其深度和广度不是这点篇幅能描述的,但作为入门和简单数据库编程应该是足够了。
好了,下面我们就可以开始练练了。
我们经常遇到数据库系统是登记系统,不管你是在单位,或是参加什么组织,登记是免不了的,而且它的结构比较简单,我们就以一个登记系统为例吧。
分析一下该系统所涉及到的数据。
二、磨刀不误砍柴功
对于登记,要跟踪的信息包括:
● 姓名 ●性别
●籍贯 ●年龄
● 出生年月●单位
● 地址 ●邮政编码
● 电话 ●传真
当然,可以简单地创建一个表,使得上述的每个数据项对应一个字段。
现在需要给表指派主键,用以唯一标识每一条记录,在登记表中分别添加登记号作为唯一键,这样就保证数据库中的任两条记录都不同了。
对数据库作出以上分析后,我们就可以开始建立数据库了。
三、建营扎寨
在这里我们学习怎样建立数据库,首先需要确定要建立数据库的类型。
在VisualBasic中通过数据访问控件或数据访问对象(DAO)可以访问下列数据库:
1.JET数据库,即MicrosoftAccess
2.ISAM数据库,如:
dBase,FoxPro等
3.ODBC数据库,凡是遵循ODBC标准的客户/服务器数据库。
如:
MicrosoftSQLServer、Oracle
一般来说,如果要开发个人的小型数据库系统,用Access数据库比较合适,要开发大、中型的数据库系统用ODBC数据库更为适宜。
而dBase和FoxPro数据库由于已经过时,除非特别的情况,否则不要使用。
在我们的例子中,当然选用Access数据库了。
建立Access数据库有两种方法:
一是在MicrosoftAccess中建立数据库。
点击“新建”按钮就可以建立新的表了(如图1)。
这里我们主要介绍第二种方法:
使用可视化数据管理器,不需要编程就可创建数据库。
可视化数据管理器是一个非常有用的应用程序,它是VB企业版和专业版附带的,在目录\..\DevStudio\vb\samples\Visdata下,其界面如下图。
点击菜单“文件”项下“新建”子项“MicrosoftACCESS”子项的“版本7.0MDB”项。
在弹出窗口中输入新建数据库的名称“登记”,出现下面图3所示窗口:
要生成新的表,右键单击数据库窗口弹出菜单,然后选择“新表”命令,在随后出现的“表结构”对话框中建立所要的字段。
每次向表中加入新的字段,单击“增加字段”按钮,会出现图4的“增加字段”对话框。
“增加字段”对话框中的选项如表10所示,根据字段的类型,有些选项是无效的,无法读取。
在我们建立的登记数据库中,各个字段的类型如表11。
要注意的是,由于字段登记号用来唯一标志记录的,因此,它不能由用户输入。
所以在定义该字段时需要定义为Long数据类型,“自动生成字段”项有效,并选中这一项。
这样当用户每输入一条新记录时,系统就会在该字段上自动输入一个与其它记录不同的值。
在ACCESS数据库中,关键字是用索引实现的,作为编程人员在对表类型的记录集编程时,只需调用索引名。
在查询时,Rushmore技术自动用索引信息优化查询。
完成表定义后,点击“增加索引”按钮,弹出如图5所示窗口。
在窗口中右边有三个选项,其意义如表12。
添加索引对话框选项
完成之后如图6。
当然,学会数据库的建立也并非一朝一夕的事,读者不妨多练习一下。
下面你就可以运行VB开始我们的编程了。
四、千里相会
VisualBasic数据库应用程序有三个部分,如图7所示。
用户程序是程序员开发的,也是我们即将用VB来编写的部分。
数据库引擎是数据库驱动程序,使用它程序员可以用统一的格式访问各种数据库,不管这个数据库是本地的VisualBasic数据库,还是所支持的其它任何格式的数据库格式,所使用的数据访问对象和编程技术都是相同的。
数据库则是我们上面完成的部分。
从这个结构可以看出用户与正在访问的特定数据库无关。
那我们在用VB编写数据库程序时,就需要使程序能够访问指定的数据库。
如果是简单的数据库应用,可以使用Data控件来执行大部分数据访问操作,而根本不用编写代码。
与Data控件相捆绑的控件自动显示来自当前记录的一个或多个字段的数据。
DATA数据控件
属性
CONNECT属性指定打开的数据库类型,并且包括参数,如用户和口令等。
例如:
打开Access数据库(缺省)
CONNECT=“ACCESS”
打开ODBC数据库
CONNECT=“ODBC;
DATABASE=?
?
;
UID=?
PWD=?
DSN=?
”
DATABASENAME属性确定数据控件访问哪一个数据库。
对于多表数据库它为具体的数据库文件名,例如:
ACCESS数据库
DATABASENAME=“D:
\...\DEMO.MDB"
对于单表数据库它为具体的数据库文件所在的目录,而具体文件名放在RECORDSOURCE属性中,例如:
访问FOXPRO数据库文件D:
\FOX\DEMO.DBF
DATABASENAME=“D:
\FOX”
RECORDSOURCE=“DEMO”不带文件扩展名
RECORDSOURCE属性
确定数据控件的记录集,即:
所要访问的数据内容。
它可以是一个表名、存储查询名或SQL语句。
访问Register表所有数据:
RECORDSOURCE=“Register”访问RC表中1973年以前出生的数据:
RECORDSOURCE=“SELECT*FROMRegisterWHERE[BIRTHDAY]<
#1/1/1973#"
注意:
当我们在运行时修改了该属性后,需要调用REFRESH方法刷新记录集。
方法
REFRESH方法当我们在运行时修改了Record-
Source属性后,需要调用该方法刷新记录集。
UPDATERECORD方法将绑定在数据控件上的控件的数据写入数据库中。
即:
当我们修改了数据后调用该方法确定修改。
CANCELUPDATE方法将数据库中的数据重新读到绑定在数据控件上的控件中。
当我们修改了数据后调用该方法放弃修改。
VB数据库编程三
事件
VALIDATE事件当我们移动记录集记录指针时发生。
我们将记录集记录指针从A移动到记录B时当产生VALIDATE事件时,记录指针仍在记录A上。
SubXXXX_Validate(ActionAsinteger,SaveAsinteger)
其中:
Action指出如何产生了该事件,如:
移动,增加,查询等。
Save表示是否保存已修改的数据。
当我们修改了绑定在数据控件的数据,又没有UPDATERECORD,则移动指针时,Save=True。
如果在事件中令Save=False,则放弃修改。
SubXXXX_Validate(ActionAsinteger,SaveAsinteger)
IfSavethen
I=MsgBox("
Dadachanged,Save?
"
vbYesNo)
IfI=vbNothen
Save=False
Endif
End if
EndSub
Reposition事件当我们移动记录集指针时发生。
我们将记录集记录指针从A移动到记录B时,当产生Reposition事件时,记录指针已移动到B上。
通常我们在该事件中显示当前的指针位置。
SubXXXX_Reposition()
XXXX.Caption=?
?
XXXX.RecordSet.AbsolutePosition+1
了解了DATA控件之后我们就可以连接数据库了。
现在我们可以编写一个应用程序。
因为虽然我们建立了Register数据库,但是数据库中却没有数据,我们程序的目的就是向数据库中输入数据。
它的运行情况如图8。
各个文本框正好对应着表Register的各个字段,在文本框中输入数据,点击“增加”按钮,就完成了一条记录的输入。
我们看一下,DATA控件是怎样和数据库连接起来的,各个文本框又是怎样和DATA控件捆绑起来的。
在DATA控件的CONNECT属性中,选中“ACCESS”项,在DatabaseName属性中,输入“C:
\TEMP\登记.mdb”,在RecordSource属性中,选中“Register”,这样就完成了数据库与DATA控件的连接,也就是完成了与应用程序的连接。
数据库中各个字段又是怎样和文本框连接起来的呢?
在VB中,我们可以将普通控件绑定在数据控件上,来完成自动地显示、更新记录集的数据。
常用的可绑定的控件有:
Label,Text,checkBox,Image等。
通过设置这些控件的DataSource和DataField属性来完成绑定。
DataSource属性表示绑定到哪一个数据控件上,程序中我们可能使用多个数据控件。
DataField属性表示绑定到记录集的哪一个记录上。
现在我们需要把Text1与表“登记”中的姓名字段连接起来。
完成DATA控件的连接之后,在Text1控件的DataSource属性中,选中“Data1”,在DataField属性中,选中“姓名”值。
用同样的方法,将各个文本框分别绑定到对应的字段上,就完成了文本框的捆绑。
下面我们编写两个按钮命令,完成其相应的操作了。
喂!
别着急,还有一个重要的对象没讲呢!
当应用程序启动时,Data控件被自动地初始化。
如果Connect、DatabaseName、Options、RecordSource、Exclusive、ReadOnly和RecordsetType属性是合法的,MicrosoftJet数据库引擎就会试图创建一个新的基于这些属性的Recordset记录集对象。
Recordset对象可以表示表中的记录或者作为查询结果的记录,使用Recordset对象可以在记录一级上对数据库中的数据进行处理。
这在数据库编程中是一个十分重要的,也是比较复杂的对象。
Recordset对象有三种类型:
表、动态集、快照,它们之间存在明显的区别。
表类型的Recordset对象是指当前数据库中的表在创建表类型的记录集时,数据库引擎打开的表。
后续的数据操作都是直接对表进行的。
只能对单个的表打开表类型的记录集,而不能对联接或者联合查询打开表类型的记录集。
与其它类型的Recordset对象相比,表类型的搜索与排序速度最快。
动态集类型的Recordset对象可以是本地的表,也可以是返回的行查询结果。
它实际上是对一个或者几个表中的记录的一系列引用。
可用动态集从多个表中提取和更新数据,其中包括链接的其它数据库中的表。
动态集类型具有一种与众不同的特点:
不同数据库的可更新联接。
利用这种特性,可以对不同类型的数据库中的表进行可更新的联接查询。
动态集和它的基本表可以互相更新。
如果动态集中的记录发生改变,同样的变化也将在基本表中反映出来。
在打开动态集的时候,如果其他的用户修改了基本表,那么动态集中也将反映出被修改过的记录。
动态集类型是最灵活的Recordset类型,也是功能最强的。
不过,它的搜索速度与其它操作的速度不及表类型的Recordset。
快照类型的Recordset对象包含的数据是固定的,它反映了在产生快照的一瞬间数据库的状态。
从MicrosoftJet数据源得到的快照是不可更新的,从开放数据库互连(ODBC)数据源得到的某些快照是可以更新的,这取决于数据库系统本身的能力。
与动态集类型和表类型的Recordset对象相比,快照的处理开销较少。
因此,它执行查询和返回数据的速度更快,特别是在使用ODBC数据源时。
快照类型保存了表中所有记录的完整复本,因此,如果记录的个数很多,快照的性能将比动态集慢得多。
为了确定快照与动态集哪一个更快,可以先以动态集方式打开记录集,然后再以快照方式打开它。
具体使用什么记录集,取决于需要完成的任务:
是要更改数据呢,还是简单地查看数据。
例如,如果必须对数据进行排序或者使用索引,可以使用表。
因为表类型的Recordset对象是做了索引的,它定位数据的速度是最快的。
如果希望能够对查询选定的一系列记录进行更新,可以使用动态集。
如果在特殊的情况下不能使用表类型的记录集,或者只须对记录进行扫描,那么使用快照类型可能会快一些。
一般来说,尽可能地使用表类型的Recordset对象,它的性能通常总是最好的。
为选择特定的Recordset类型,把Data控件的RecordsetType属性设成:
VB数据库编程四
119加入时间:
46:
17评论(0)
RecordSet记录集属性
BOF属性当记录集记录指针指向第一条记录时返回True
EOF属性当记录集记录指针指向最后一条记录时返回True
AbsloutePosition属性返回当前记录集记录指针,第一条记录为0,是只读属性
Bookmark属性String类型,返回或设置当前记录集记录指针的书签,是可读写属性。
每一条记录都有自己唯一的书签,它与记录在记录集中的顺序无关。
将Bookmark属性存放到变量中,后面可以通过将该变量赋值给Bookmark属性,并返回到这个记录。
程序中使用BookMark属性重定位记录指针,而不能使用Abslouteposition
NoMatch属性当我们使用Find方法查询时如果未找到则返回True。
常与BookMark属性同时使用。
查找[NAME]字段中第一个姓李的人
DimSAsString
WithXXXX.RecordSet
S=.BookMark
.FindFirst"
[NAME]Like'
李*'
if.NoMatchthen
MsgBox"
数据未找到“
.BookMark=S
EndWith
记录集方法
AddNew方法向记录集增加一条新记录
Delete方法从记录集中将当前记录删除。
在删除后常使用MoveNext方法移动指针。
.Delete
.MoveNext
if.EOFthen.MoveLast
MoveXXXX方法
MoveFirst将记录集指针移动到第一条记录上
MoveLast将记录集指针移动到最后一条记录上
MovePrevious将记录集指针移动到前一条记录上
MoveNext将记录集指针移动到下一条记录上
FindXXXX方法
FindFirst在记录集中查询符合条件的第一条记录
FindLast在记录集中查询符合条件的最后一条记录
FindPrevious在记录集中查询符合条件的前一条记录
FindNext在记录集中查询符合条件的下一条记录
好了,有了这么充分的知识了,编写两个按钮命令简直是小菜一碟,先来试一下,添一个“增加”命令按钮吧。
PrivateSubCommand1_Click()
Data1.Recordset.AddNew
哇!
怎么这么简单,再看一下“删除”命令按钮
PrivateSubCommand2_Click()
Data1.Recordset.Delete
就这样行了吗?
运行程序吧,OK!
一切正常,迫不及待地输入一条记录,点击“增加”按钮,怎么?
出问题了!
因为你只有在进行了AddNew方法后才可以输入数据,好吧,在窗口的初始化时就增加一条新记录吧。
PrivateSubForm_Initialize()
输入完了数据,我们打算