APP下载

Data控件及对dbf表的编程

2014-09-01张参军

新媒体研究 2014年11期
关键词:控件语句示例

张参军

摘要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

猜你喜欢

控件语句示例
使用“填表单”微信小程序 统计信息很方便
基于.net的用户定义验证控件的应用分析
10秒记忆
飞吧,云宝
《中考“仿写”题解题技法指津》参考答案
基本算法语句
我喜欢
高考作文“踮起脚尖”升格示例
作文语句实录
利用VF6.0的Timer控件实现动画效果