陶佳琦,翁正新
VB訪問Access數據庫的研究
陶佳琦,翁正新
介紹了實現此過程的主要步驟和程序代碼,以地鐵列車故障診斷系統為例,設計了一種VB通過ADO方式訪問Access數據庫的方法,能對不同數據表中的數據進行多次檢索,檢索結果能按需求同時顯示在VB的數據表格控件中。介紹了實現此過程的主要步驟和程序代碼。
VB;Access數據庫;地鐵列車
在設計系統的過程中,數據庫的程序設計是至關重要的,在程序運行過程中,更好地訪問、檢索及顯示數據庫中數據,能使程序更人性化、用戶使用更便捷。地鐵列車故障診斷系統數據庫通過Access建立,維護人員在使用過程中,診斷系統會對數據庫進行多次訪問及檢索從而給出診斷建議。本文針對地鐵列車故障診斷系統,利用VB[1]中的ADO對象訪問數據庫,通過組合框控件及空的數據表作為數據存儲中轉點,使多次檢索得到的多組數據能同時顯示在VB的數據表格控件上,使維護人員能方便快捷地處理列車故障。
1.1 數據庫的簡介
Microsoft Office Access是微軟把數據庫引擎的圖形用戶界面和軟件開發工具結合在一起的一個數據庫管理系統。Access數據庫具有存儲方式簡單,易于維護管理、界面友好,易操作、集成環境,處理多種數據信息等優點[2~3]。地鐵列車故障診斷系統數據庫,如表1所示:

表1 地鐵列車故障診斷系統數據庫

案例表列車號;時間;故障類型;故障現象;故障原因;編號存儲列車發生過的故障案例 有診斷建議表 故障原因;排查順序;次數 程序運行中存儲檢索的數據 無
數據庫構建完成后,需在VB中采用合適的方式進行數據訪問,VB作為一款強大的編程軟件,支持DAO、RDO、ADO等多種訪問數據庫的方式,比較分析后,本文采用ADO方式對數據庫進行訪問。
1.2 ADO簡介
ADO(ActiveX Data Object)稱為ActiveX數據對象,是微軟公司開發數據庫應用程序面向對象的新接口,ADO數據庫接口繼承了早期基于ODBC的DAO、RDO所使用的對象模型,并加以改進,包含了較少的對象、更多的屬性方法和事件。ADO有 7個對象:Command(命令)對象、Conection(連接)對象、Recorsdet(記錄集)對象、Parameter(參數)對象、Field(域)對象、Error(錯誤)對象和Property(屬性)對象,其中Conection對象主要用于應用程序和數據源的連接;Command對象主要有執行命令函數Execute等; Recordset對象主要包括記錄集移動函數、記錄集打開及關閉函數、創建新記錄函數、刪除及更新函數等[4~6]。
2.1 設計原理
程序的原理設計如圖1所示:

圖1 原理設計圖
程序首先通過ADO的Connection對象連接診斷系統數據庫,隨后,通過ADO的Recorsdet對象結合相應的Sql語句,檢索數據庫得到“故障原因”、“排查順序”、“次數”字段,通過將數據轉存至組合框控件及診斷建議表,最終使數據顯示在數據表格控件中。
2.2 具體步驟
A. Connection對象連接數據庫
在訪問數據庫之前需建立與數據源的連接并保持,這一過程通過ADO的Conneciton對象實現,在連接過程中,首先,將Access數據庫引擎類型、是否保存安全信息、數據來源等信息賦予字符串str,隨后,設定con為新的ADO連接,再將字符串str賦予con的連接字段串屬性,最后,通過con的open函數完成數據庫的連接,具體代碼如下:
1) str = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;
2) Data Source=" & App.Path & "地鐵列車故障診斷系統.mdb"
3) Set con = New ADODB.Connection
4) con.ConnectionString = str
5) con.Open
B. Recordset對象檢索數據
在ADO數據庫編程中,可通過Recordset對象進行檢索、添加、修改記錄等操作,在本程序中,首先,設定了一個新的記錄集rs,然后,通過調用Open()函數打開記錄集,執行Sql語句,Open()函數的各項參數依次為sql,con,adOpenDynamic(動態游標), adLockOptimistic(樂觀鎖定),最后,通過MoveNext(移動到后一條記錄)、AddNew(增加新記錄)、Update(更新記錄集)等常用操作,結合組合框控件、數據表格控件完成數據的檢索、轉存及顯示。
在程序的檢索過程中,依次得到了“故障原因”、“排查順序”、“字段”3個字段并存儲在組合框控件中,以“列車觸發緊急制動”這一故障現象為例,檢索結果,如圖2所示:

圖2 檢索結果
各個字段的檢索、顯示過程及程序代碼如下:
1)“故障原因”字段檢索及存儲“故障原因”字段的過程如圖3所示:

圖3 檢索及存儲“故障原因”字段流程圖
程序首先通過調用Open()函數執行Sql語句,檢索得到“故障原因”字段,隨后,通過Do While循環語句,將“故障原因”字段中的數據存入組合框控件中。
程序代碼如下:
01 sql = "select 故障原因 from 故障 where 故障類型
02 in ('" & Combo1.Text & "') and 故障現象 in ('" & Combo2.Text & "') "
03 Set rs = New ADODB.Recordset
04 rs.Open sql, con, adOpenDynamic, adLockOptimistic
05 Do While Not rs.EOF
06 Combo3.AddItem rs("故障原因")
07 rs.MoveNext
08 Loop
09 rs.Close
2)“排查順序”字段
“排查順序”字段的檢索及存儲過程與“故障原因”字段類似,在此不再贅述,僅給出相應的程序代碼如下:
01 sql = "select 排查順序 from 故障 where 故障類型
02 in ('" & Combo1.Text & "') and 故障現象 in ('" & Combo2.Text & "') "
03 rs.Open sql, con, adOpenDynamic, adLockOptimistic
04 Do While Not rs.EOF
05 Combo5.AddItem rs("排查順序")
06 rs.MoveNext
07 Loop
08 rs.Close
3)“次數”字段
在檢索及存儲“次數”字段的過程中,由于每一個故障原因都要檢索發生過的案例次數,
每次檢索均需要重復打開記錄集、檢索數據、存入組合框、關閉記錄集這一過程,因此,在編程中采用For循環語句,通過將相應的組合框項目數作為條件,將各個故障原因的“次數”存入組合框控件中。程序代碼如下:
01 For i = 0 To Combo3.ListCount -1
02 sql = "select count(*) from 案例 where 故障原因
03 like '%" & Combo3.List(i) & "%' and 故障現象 = '" & Combo2.Text & "' "
04 rs.Open sql, con, adOpenDynamic, adLockOptimistic
05 Combo4.AddItem (rs(0))
06 rs.Close
07 Next i
C. 診斷建議表轉存數據
為了使檢索得到的3個字段能同時在數據表格中顯示,需要將3個字段的數據同時轉存至Access的診斷建議表中,轉存結果,如圖4所示:

圖4 轉存結果
轉存流程如圖5所示:

圖5 轉存數據流程圖
整個過程通過For循環語句完成,利用Open()函數執行相應的Sql語句,通過記錄集的增加新記錄、更新記錄等操作將組合框中數據轉存至Access診斷建議表中。
相關代碼如下:
01 For i = 0 To Combo3.ListCount - 1
02 sql = " select * from 診斷建議"
03 rs.Open sql, con, adOpenDynamic, adLockOptimistic
04 rs.AddNew
05 rs.MoveLast
06 rs.Fields(0) = Combo3.List(i)
07 rs.Fields(1) = Combo4.List(i)
08 rs.Fields(2) = Combo5.List(i)
09 rs.Update
10 rs.Close
11 Next i
D. 數據表格控件顯示數據
在顯示數據的過程中,首先設置記錄集游標服務的位置為adUseClient(本地游標庫提供的客戶端的游標)。隨后,調用Open()函數打開記錄集,執行Sql語句,將診斷建議表中的內容先按“次數”降序、再按“排查順序”升序。最后,通過將記錄集賦予數據表格控件的數據源,完成數據的顯示過程。顯示結果如圖6所示:

圖6 顯示數據
程序代碼如下:
01 sql = " select * from 診斷建議 order by 次數DESC,排查順序 ASC"
02 rs.CursorLocation = adUseClient
03 rs.Open sql, con, adOpenDynamic, adLockOptimistic
04 Set DataGrid1.DataSource = rs
05 End If
06 End Sub
本文中提出的方法能很好地對Access數據庫進行訪問、檢索及顯示,使維護人員得到所需的數據,從而對地鐵列車故障進行診斷,同時,該方法還有著很好的擴展性,針對不同程序背景,只需通過建立相應數量的組合框控件及空Access數據表,便能很好地對數據庫進行多次檢索,滿足用戶的不同需求。VB對數據庫的處理有著強大的功能,在今后的系統開發中,應進一步對此加以研究應用,使程序更優化,用戶操作更便捷。
[1] 國家863中部軟件孵化器.Visual Basic從入門到精通[M].北京:人民郵電出版社,2010
[2] 高勇,符敢為.基于VC+ADO+Access的數據庫訪問技術在Pro/E環境下的實現[J] .機械設計與制造工程, 2013,42(3):14-17
[3] 董晶晶.基于VB與Access的人事信息管理系統設計[J].科技資訊, 2013(13):18-19
[4] 馮曉星,馬曉靜.VC基于ADO技術訪問Access數據庫[J].計算機與網絡, 2013(8):54-56
[5] 賈保英.VB環境下ADO數據庫開發技術[J].中小企業管理與科技, 2013(24):286-287
[6] 衣文鳳,劉玫,王大鵬.Vb+Access在柴油機故障診斷系統界面記憶輸入中的程序設計[J]. 科技創新導報, 2009(8):12-12
Study on VB Accessing to Access Database
Tao Jiaqi, Weng Zhengxin
(1.Department of Automation,Shanghai Jiao Tong University, Shanghai200240,China; 2. Rolling Stock Branch of Shanghai Rail Transit maintenance support Co.,Ltd., Shanghai200233, China)
Taking the fault diagnosis system of metro vehicle as an example, a method of VB accessing to Access database by ADO way is designed. This method is applied to retrieval the data from different data table. The retrieval results can be displayed on the VB datagrid control simultaneously according to the demand. The main process and the program code are also introduced.
VB; Access Database; Metro Vehicle
TP391
A
1007-757X(2014)10-0014-03
2014.05.15)
上海市自然科學基金(12ZR1415000)
陶佳琦(1987-), 男,上海,上海交通大學自動化系,碩士研究生,研究方向:故障診斷,上海,200240
翁正新(1966-),男,江蘇,上海交通大學自動化系,副教授,博士,研究方向:故障診斷與容錯控制,上海,200240