張參軍
摘要Basic是早期編程的入門語言,結(jié)構(gòu)緊湊,易上手。隨著可視化平臺VB的推出,增加和鞏固了用戶群。VB對小型數(shù)據(jù)庫編程,有一定的優(yōu)勢,同時可以使用的控件很多,Data控件就是其中之一。Data控件連接數(shù)據(jù)庫,可以實現(xiàn)大量的數(shù)據(jù)管理功能。Foxpro是早期記錄集處理編程語言,隨著VF平臺的推出,dbf數(shù)據(jù)格式的應(yīng)用日益廣泛。Data控件及其dbf表的操作,需要處理的問題及其思路,在此做一個簡單的闡述,希望能給日常編程帶來幫助(假設(shè)Data控件名是Data)。
關(guān)鍵詞Data控件;連接;切換;刪除;更改;索引;復制;查詢
中圖分類號:TP3 文獻標識碼:A 文章編號:1671-7597(2014)11-0131-02
1Data連接的建立
1.1 直接連接
指定要連接的表的路徑、類型、表名稱。VB支持的數(shù)據(jù)類型較多:access、foxpro、dBase、Excel、Lotus等,支持最好的是access表。記錄集類型有三種:0對應(yīng)table,就是表;1對應(yīng)dynaset,2對應(yīng)snapshot。
示例:連接安裝路徑下ku目錄中ys200.dbf表
Data.Connect = "FoxPro 2.0"'表的類型
Data.DatabaseName = App.Path & "" & "ku" '表的路徑
Data.RecordSource = "ys200"'表名稱
Data.RecordsetType = 0 '記錄集類型
1.2 通過變量連接
經(jīng)常需要暫時斷開當前的表連接,將Data指向另一個表進行操作。操作結(jié)束后,再通過變量實現(xiàn)Data與原表的連接。下面示例原表名稱提取到變量ybming中,以及Data控件與ybming變量中保存的原表名的連接。
ybming = Data1.RecordSource '提取原表名稱到變量
Data.DatabaseName = App.Path & "ku" '重定位表路徑
Data.RecordSource = ybming '重建表連接
Data1.RecordsetType = 0
2Data連接的斷開與切換
Data控件沒有提供斷開表連接的方法,應(yīng)用中使用表的切換(重定向)的方法實現(xiàn)斷開的目的,比如讓Data連接到一個目前不會引用的表上,示例略過。
3表的復制與索引的建立
使用復制函數(shù)Filecopy復制表和索引文件,得到的復制表和原表結(jié)構(gòu)相同,得到的索引文件也不會發(fā)生變化,仍保持和復制表的對應(yīng)關(guān)系。如果使用sql語句復制,得到的索引文件和表文件不對應(yīng),必須重建索引。如果復制Data目前引用的表,需要先做表連接的切換,釋放當前表的引用,獲取復制權(quán)限。
3.1 Filecopy復制
Filecopy函數(shù)使用廣泛,在此不做說明,使用參看下面的示例。
示例:復制c盤下aa表(未引用)及其索引文件到c盤下bb表
FileCopy"c:aa.dbf", "c:b.dbf" '復制dbf文件
FileCopy"c:aa.cdx", "c:b.cdx" '復制索引文件
3.2 sql復制
要執(zhí)行sql語句,先[引用]Microsoft DAO2.5/3.51 Compatibility Library,然后定義、初始化Database庫對象,借助庫對象提供的方法,實現(xiàn)復制。
示例:復制c盤下ku目錄中表aa.dbf、索引aa.cdx文件為對應(yīng)的bb文件
Dim dbs As Database'定義庫對象
Dim sql As String '定義執(zhí)行sql語句的字符變量sql
Set dbs = OpenDatabase("c:ku", False, False, "FoxPro 2.0")
sql = "select*intobb.dbffrom aa.dbf"'初始化aa
dbs.Execute sql '執(zhí)行復制
sql = "create index 名次 on bb.dbf(名次)" '初始化aa
dbs.Execute sql'創(chuàng)建字段"名次"的索引
創(chuàng)建必要字段的索引后,同名索引文件bb.cdx隨即產(chǎn)生。
4表記錄的添加、修改、更新與刷新
Data控件提供了記錄集方法,可以追加、修改表記錄,然后使用更新方法,使記錄變動從內(nèi)存轉(zhuǎn)移到記錄,產(chǎn)生實際效果。使用更新方法,必須在使用添加、編輯方法的前提下,否則系統(tǒng)拒絕執(zhí)行更新操作。刷新方法,重取表中記錄和數(shù)據(jù)綁定控件對應(yīng),同時定位第一條記錄為當前記錄。
添加代碼:Data.Recordset.Addnew
修改代碼:Data.Recordset.Edit
更新代碼:Data.Recordset.Update
刷新代碼:Data.Refresh
5表記錄的刪除
Vb中沒有提供徹底刪除記錄的方法,用Data控件記錄集方法delete,只是給符合條件的記錄打上了刪除標記。要徹底刪除記錄:先使用sql的select語句建立和當前表結(jié)構(gòu)一致的臨時表;然后用記錄集方法delete從原表刪除記錄;再使用sql的insert語句將原表剩余記錄追加到臨時表;釋放并刪除原表;重命名臨時表為原表,完成刪除操作。示例刪除c盤ku目錄下aa表中性別為"女"的記錄:
ybming = Data1.RecordSource '提取原表名稱到變量
Dim dbs As Database '定義庫對象
Dim sql As String '定義執(zhí)行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'產(chǎn)生結(jié)構(gòu)相同的表ls.dbf,同時添加剩余記錄
……'建立ls表索引的代碼
…… '重定向Data到其他數(shù)據(jù)源,為刪除做準備
Kill "c:aa.dbf"'刪除aa.dbf
Kill"c:aa.cdx" '刪除aa的索引文件
sql = "select*intoaa.dbffromls.dbf"
dbs.Execute sql '由ls.dbf重新產(chǎn)生aa.dbf
…… '建立aa表索引的代碼
…… '重建Data到aa的連接
endprint
6表記錄的查詢
查詢使用的記錄集方法有find、seek兩種,找到后自動定位符合條件的第一條記錄為當前記錄;不能復合查詢;find查詢沒有seek查詢速度快。seek方法主要對表操作,查找前必須指定當前的索引字段。sql語句功能強大,可以復合查詢,找到后也定位符合條件的第一條記錄為當前記錄,但是查找字段必須為索引字段,無需專門指定。復合查詢要注意查詢字段、查詢對象的類型,以及查詢條件等是否放在變量中。多表聯(lián)動查詢,可參考相關(guān)資料,在此略過。
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字符變量并初始化,然后執(zhí)行sql語句實現(xiàn)查詢
Dim dbs As Database '定義庫對象
Dim sql As String '定義執(zhí)行sql的字符變量sql
Set dbs = OpenDatabase("c:ku", False, False, "FoxPro 2.0")
sql= "select*intols.dbffromaa.dbfwhere 性別='女' "
dbs.Execute sql
6.2.2 通過變量查詢
查詢的對象放在變量中,這時注意,查詢的對應(yīng)字段是字符型還是數(shù)值型,則對應(yīng)的sql語句對變量的引用方法不同。假設(shè)變量名是aa,當前表名放在變量ybming中,兩種引用方法示例如下(查找性別為"女"的記錄):
字符型的情況:
aa = "select*intols.dbffrom" & ybming & "where 名次= " & aa & "
數(shù)值型的情況
aa = "select*intols.dbffrom" & ybming & "where 名次= '" & aa & "' "
6.2.3 sql復合條件查詢
復合查詢要考慮查詢字段、查詢對象的類型,以及查詢字段、查詢條件、查詢對象是否在變量中,不同情況對應(yīng)的方法不同。
假設(shè)表名稱變量是ybming,字段變量是ziduan1(字符型)、ziduan2(數(shù)值型),條件變量是tiaojian1、tiaojian2,對象變量是duixiang1(字符型)、duixiang2(數(shù)值型),邏輯條件放在變量luoji中,示例如下:
aa = "select*intols.dbffrom" & ybming & "where" & ziduan1 & "" & tiaojian1 & "" & duixiang1 & " " & luoji & "" & ziduan2 & "" & tiaojian2 & " '" & duixiang2 & "'"
7表記錄的排序
排序使用sql語句的order by子句完成,默認升序排列,降序使用Desc參數(shù);排序同樣需要考慮查詢字段的類型,以及查詢字段、查詢條件、查詢對象是否在變量中,是否復合查詢,不同情況對應(yīng)的方法不同。
假設(shè)條件同六中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控件,結(jié)合其他記錄集方法,能滿足日常的數(shù)據(jù)處理需求,特別是Data控件和數(shù)據(jù)綁定控件的結(jié)合,呈現(xiàn)給用戶的是更直觀的管理效果。Data控件使用中有一定的局限性,這受制于VB平臺本身對數(shù)據(jù)處理的能力,比如記錄的刪除。VB的ADO數(shù)據(jù)控件有較好的操作靈活性,使用方法基本同Data控件。使用Data控件,借助VB對dbf表操作,是窺探和學習數(shù)據(jù)管理編程的一個窗口和方法。
參考文獻
[1]宋廣群,姚成.vb程序設(shè)計[M].中國科學技術(shù)大學出版社,2006.
[2]林卓然.VB語言程序設(shè)計[M].電子工業(yè)出版社,2009.
[3]黃振軒、宋衛(wèi)海、林立松.vb程序設(shè)計與數(shù)據(jù)庫[M].電子工業(yè)出版社,2007.
endprint