Data控件及对dbf表的编程
2014-09-01张参军
张参军
摘要Basic是早期编程的入门语言,结构紧凑,易上手。随着可视化平台VB的推出,增加和巩固了用户群。VB对小型数据库编程,有一定的优势,同时可以使用的控件很多,Data控件就是其中之一。Data控件连接数据库,可以实现大量的数据管理功能。Foxpro是早期记录集处理编程语言,随着VF平台的推出,dbf数据格式的应用日益广泛。Data控件及其dbf表的操作,需要处理的问题及其思路,在此做一个简单的阐述,希望能给日常编程带来帮助(假设Data控件名是Data)。
关键词Data控件;连接;切换;删除;更改;索引;复制;查询
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2014)11-0131-02
1Data连接的建立
1.1 直接连接
指定要连接的表的路径、类型、表名称。VB支持的数据类型较多:access、foxpro、dBase、Excel、Lotus等,支持最好的是access表。记录集类型有三种:0对应table,就是表;1对应dynaset,2对应snapshot。
示例:连接安装路径下ku目录中ys200.dbf表
Data.Connect = "FoxPro 2.0"'表的类型
Data.DatabaseName = App.Path & "" & "ku" '表的路径
Data.RecordSource = "ys200"'表名称
Data.RecordsetType = 0 '记录集类型
1.2 通过变量连接
经常需要暂时断开当前的表连接,将Data指向另一个表进行操作。操作结束后,再通过变量实现Data与原表的连接。下面示例原表名称提取到变量ybming中,以及Data控件与ybming变量中保存的原表名的连接。
ybming = Data1.RecordSource '提取原表名称到变量
Data.DatabaseName = App.Path & "ku" '重定位表路径
Data.RecordSource = ybming '重建表连接
Data1.RecordsetType = 0
2Data连接的断开与切换
Data控件没有提供断开表连接的方法,应用中使用表的切换(重定向)的方法实现断开的目的,比如让Data连接到一个目前不会引用的表上,示例略过。
3表的复制与索引的建立
使用复制函数Filecopy复制表和索引文件,得到的复制表和原表结构相同,得到的索引文件也不会发生变化,仍保持和复制表的对应关系。如果使用sql语句复制,得到的索引文件和表文件不对应,必须重建索引。如果复制Data目前引用的表,需要先做表连接的切换,释放当前表的引用,获取复制权限。
3.1 Filecopy复制
Filecopy函数使用广泛,在此不做说明,使用参看下面的示例。
示例:复制c盘下aa表(未引用)及其索引文件到c盘下bb表
FileCopy"c:aa.dbf", "c:b.dbf" '复制dbf文件
FileCopy"c:aa.cdx", "c:b.cdx" '复制索引文件
3.2 sql复制
要执行sql语句,先[引用]Microsoft DAO2.5/3.51 Compatibility Library,然后定义、初始化Database库对象,借助库对象提供的方法,实现复制。
示例:复制c盘下ku目录中表aa.dbf、索引aa.cdx文件为对应的bb文件
Dim dbs As Database'定义库对象
Dim sql As String '定义执行sql语句的字符变量sql
Set dbs = OpenDatabase("c:ku", False, False, "FoxPro 2.0")
sql = "select*intobb.dbffrom aa.dbf"'初始化aa
dbs.Execute sql '执行复制
sql = "create index 名次 on bb.dbf(名次)" '初始化aa
dbs.Execute sql'创建字段"名次"的索引
创建必要字段的索引后,同名索引文件bb.cdx随即产生。
4表记录的添加、修改、更新与刷新
Data控件提供了记录集方法,可以追加、修改表记录,然后使用更新方法,使记录变动从内存转移到记录,产生实际效果。使用更新方法,必须在使用添加、编辑方法的前提下,否则系统拒绝执行更新操作。刷新方法,重取表中记录和数据绑定控件对应,同时定位第一条记录为当前记录。
添加代码:Data.Recordset.Addnew
修改代码:Data.Recordset.Edit
更新代码:Data.Recordset.Update
刷新代码:Data.Refresh
5表记录的删除
Vb中没有提供彻底删除记录的方法,用Data控件记录集方法delete,只是给符合条件的记录打上了删除标记。要彻底删除记录:先使用sql的select语句建立和当前表结构一致的临时表;然后用记录集方法delete从原表删除记录;再使用sql的insert语句将原表剩余记录追加到临时表;释放并删除原表;重命名临时表为原表,完成删除操作。示例删除c盘ku目录下aa表中性别为"女"的记录:
ybming = Data1.RecordSource '提取原表名称到变量
Dim dbs As Database '定义库对象
Dim sql As String '定义执行sql的字符变量
Set dbs = OpenDatabase("c:ku", False, False, "FoxPro 2.0")
sql = "delete*fromaa.dbfwhere 性别='女' "
dbs.Execute sql'从aa.dbf中清除性别为"女"的记录
sql = "select*intols.dbffromaa.dbf"
dbs.Execute sql'产生结构相同的表ls.dbf,同时添加剩余记录
……'建立ls表索引的代码
…… '重定向Data到其他数据源,为删除做准备
Kill "c:aa.dbf"'删除aa.dbf
Kill"c:aa.cdx" '删除aa的索引文件
sql = "select*intoaa.dbffromls.dbf"
dbs.Execute sql '由ls.dbf重新产生aa.dbf
…… '建立aa表索引的代码
…… '重建Data到aa的连接
endprint
6表记录的查询
查询使用的记录集方法有find、seek两种,找到后自动定位符合条件的第一条记录为当前记录;不能复合查询;find查询没有seek查询速度快。seek方法主要对表操作,查找前必须指定当前的索引字段。sql语句功能强大,可以复合查询,找到后也定位符合条件的第一条记录为当前记录,但是查找字段必须为索引字段,无需专门指定。复合查询要注意查询字段、查询对象的类型,以及查询条件等是否放在变量中。多表联动查询,可参考相关资料,在此略过。
6.1 seek查询(find查询略过)
示例:查询aa中性别为”女”的记录
Data.Recordset.Index =”性别” ‘指定当前索引字段
Data.Recordset.Seek“=”,”女” ‘seek查询
(Data.Recordset.Seek“=”,xb ‘seek查询,查询对象在变量xb中的情况)
6.2 sql单一条件查询
6.2.1 直接查询
示例:查询aa中性别为"女"的记录
定义库对象、sql字符变量并初始化,然后执行sql语句实现查询
Dim dbs As Database '定义库对象
Dim sql As String '定义执行sql的字符变量sql
Set dbs = OpenDatabase("c:ku", False, False, "FoxPro 2.0")
sql= "select*intols.dbffromaa.dbfwhere 性别='女' "
dbs.Execute sql
6.2.2 通过变量查询
查询的对象放在变量中,这时注意,查询的对应字段是字符型还是数值型,则对应的sql语句对变量的引用方法不同。假设变量名是aa,当前表名放在变量ybming中,两种引用方法示例如下(查找性别为"女"的记录):
字符型的情况:
aa = "select*intols.dbffrom" & ybming & "where 名次= " & aa & "
数值型的情况
aa = "select*intols.dbffrom" & ybming & "where 名次= '" & aa & "' "
6.2.3 sql复合条件查询
复合查询要考虑查询字段、查询对象的类型,以及查询字段、查询条件、查询对象是否在变量中,不同情况对应的方法不同。
假设表名称变量是ybming,字段变量是ziduan1(字符型)、ziduan2(数值型),条件变量是tiaojian1、tiaojian2,对象变量是duixiang1(字符型)、duixiang2(数值型),逻辑条件放在变量luoji中,示例如下:
aa = "select*intols.dbffrom" & ybming & "where" & ziduan1 & "" & tiaojian1 & "" & duixiang1 & " " & luoji & "" & ziduan2 & "" & tiaojian2 & " '" & duixiang2 & "'"
7表记录的排序
排序使用sql语句的order by子句完成,默认升序排列,降序使用Desc参数;排序同样需要考虑查询字段的类型,以及查询字段、查询条件、查询对象是否在变量中,是否复合查询,不同情况对应的方法不同。
假设条件同六中6.2.3,按照"用时"字段排序,示例如下:
7.1 order by直接排序
aa = "select*into ls.dbffrom" & ybming & "where" & duixiang1 & "" & tiaojian1 & "" & duixiang1 & " " & luoji & "" & duixiang2 & " " & tiaojian2 & " '" & duixiang2 & "' order by 用时"
7.2 通过变量排序
排序字段“用时”放在变量yongshi中的情况
aa = "select*into ls.dbffrom" & ybming & "where" & duixiang1 & "" & tiaojian1 & "" & duixiang1 & " " & luoji & "" & duixiang2 & "" & tiaojian2 & " '" & duixiang2 & "'order by" & yongshi & ""
借助Data控件,结合其他记录集方法,能满足日常的数据处理需求,特别是Data控件和数据绑定控件的结合,呈现给用户的是更直观的管理效果。Data控件使用中有一定的局限性,这受制于VB平台本身对数据处理的能力,比如记录的删除。VB的ADO数据控件有较好的操作灵活性,使用方法基本同Data控件。使用Data控件,借助VB对dbf表操作,是窥探和学习数据管理编程的一个窗口和方法。
参考文献
[1]宋广群,姚成.vb程序设计[M].中国科学技术大学出版社,2006.
[2]林卓然.VB语言程序设计[M].电子工业出版社,2009.
[3]黄振轩、宋卫海、林立松.vb程序设计与数据库[M].电子工业出版社,2007.
endprint