在VB中引用.dbf及索引文件
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者:羊黎蓉 如何用FOX以外的編程語言來取得.dbf 數據庫 的記錄值和引用.idx和.cdx索引一直都是 程序員 討論的話題之一?,F有一任務是在一個觸摸屏系統中加入一個用戶查詢水費界面。每個用戶可隨時查詢到自己的水費記錄。我使用 VB 5.0,希望打開NetWare系統
作者:羊黎蓉
如何用FOX以外的編程語言來取得.dbf
數據庫的記錄值和引用.idx和.cdx索引一直都是
程序員討論的話題之一?,F有一任務是在一個觸摸屏系統中加入一個用戶查詢水費界面。每個用戶可隨時查詢到自己的水費記錄。我使用
VB5.0,希望打開NetWare系統下營業收費系統的七個.dbf數據表并進行查詢。每個數據表有將近10萬條記錄。通過10M集線器交換數據,查詢的字段都不是唯一的。顯然這樣大的數據量,又是通過10M
網絡傳遞,如果VB使用
SQL方式查詢,則最少要2分鐘時間才能得到答復。讓一個用戶在機器旁邊等2分鐘是不現實的。于是想利用FoxPro自身的.idx或.cdx索引文件來查找。
編程可用兩種方式實現。一種是直接在VB中調用,另一種使用VB中的shell函數調用FoxPro的exe程序。
方法一、直接在VB中調用.dbf文件
一、.在FoxPro數據庫的所在目錄下建立一個與FoxPro數據庫文件名相同的.inf文本文件
步驟:1.創建文本文件*.inf,與數據表同名。
2.在文本文件的第一行,輸入[FoxPro 2.5];如果指定的是FoxPro 2.0索引,則輸入[FoxPro 2.0],其余以此類推。
3.依次輸入各指定索引文件名形式IDXn=*.idx或CDXn=*.cdx。其中n為數字,依次表示第1個IDX索引文件,第2個IDX索引文件?;虻?個CDX索引文件,第2個……以此類推。
注意:如果不能將.inf文件與數據庫存儲在同一目錄下,或為了維護方便而希望將所有文件存儲在一個共享點??刹捎脛摻?STRONG>
Windows注冊表項的方法,指向存儲.inf的文件路徑。(詳見VB5的聯機手冊)
二、編寫程序
用OPENDATABASE方法直接打開外部FoxPro表。
主要語句如下:
dim db as database
dim tb as recordset
′打開外部數據庫
set db=opendatabase(“c:\fox\”,false,false,”foxpro 2.5;”)′注意FoxPro與2.5之間必須有空格
set tb=db.openrecordset(“abc”)
′調用索引
tb.index=“abc1#idx”′注意索引名為“索引文件名#后綴名”
tb.seek“=”,“111-111”′搜索唯一值為“111-111”的記錄
方法二、用shell()函數調用VF的idx文件
用VB接受用戶命令,然后調用VF的.prg編譯的.exe文件,按用戶要求在數據庫中查詢,將查詢結果放置在一個.TXT文件中。VB從.TXT文件取數顯示,再次將查詢結果傳遞給VF的.prg編譯的.exe文件,查詢取數結果。具體編程從略,這里要著重討論shell()函數的特性:shell函數是以異步方式來執行其它程序的。也就是說,用shell啟動的程序可能還沒有完成執行過程,就已經執行到shell函數之后的語句。這種執行方式打亂了程序固有的順序執行方式,如果不加注意,程序的運行將產生混亂。
如果語句如下
……
shell(c:\file1.exe)′調用file.exe文件,并把結果放置在X1.txt中
open c:\x1.txt for output as#1′打開X1.TXT文件,取查詢結果。
……
按一般執行方式,上述語句應能正確執行。然而實際運行時,即使語句全部正確,也會彈出錯誤信息框:x1.txt文件不存在。原因就在于VB在執行shell()語句時,file1.exe文件還未執行完,就繼續下一行語句:打開file1文件創建的x1.txt;所以出現錯誤。
經過多次實驗,我最后采用了VB工具條中的timer控件來完成時間等待,程序編程通過。
……
shell(c:\file1.exe)
‘運行計時器
timer1.enabled=true
……
sub timer1_timer()
if dir(“c:\x1.txt”)<>””then
open c:\x1.txt for output as#1
……
timer1.enabled=false
end sub 實際運行速度很快,2~3秒內完成查詢操作。
原文轉自:http://www.anti-gravitydesign.com