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

表1 地鐵列車故障診斷系統(tǒng)數(shù)據(jù)庫

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

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

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

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

圖4 轉(zhuǎn)存結(jié)果
轉(zhuǎn)存流程如圖5所示:

圖5 轉(zhuǎn)存數(shù)據(jù)流程圖
整個(gè)過程通過For循環(huán)語句完成,利用Open()函數(shù)執(zhí)行相應(yīng)的Sql語句,通過記錄集的增加新記錄、更新記錄等操作將組合框中數(shù)據(jù)轉(zhuǎn)存至Access診斷建議表中。
相關(guān)代碼如下:
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. 數(shù)據(jù)表格控件顯示數(shù)據(jù)
在顯示數(shù)據(jù)的過程中,首先設(shè)置記錄集游標(biāo)服務(wù)的位置為adUseClient(本地游標(biāo)庫提供的客戶端的游標(biāo))。隨后,調(diào)用Open()函數(shù)打開記錄集,執(zhí)行Sql語句,將診斷建議表中的內(nèi)容先按“次數(shù)”降序、再按“排查順序”升序。最后,通過將記錄集賦予數(shù)據(jù)表格控件的數(shù)據(jù)源,完成數(shù)據(jù)的顯示過程。顯示結(jié)果如圖6所示:

圖6 顯示數(shù)據(jù)
程序代碼如下:
01 sql = " select * from 診斷建議 order by 次數(shù)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數(shù)據(jù)庫進(jìn)行訪問、檢索及顯示,使維護(hù)人員得到所需的數(shù)據(jù),從而對地鐵列車故障進(jìn)行診斷,同時(shí),該方法還有著很好的擴(kuò)展性,針對不同程序背景,只需通過建立相應(yīng)數(shù)量的組合框控件及空Access數(shù)據(jù)表,便能很好地對數(shù)據(jù)庫進(jìn)行多次檢索,滿足用戶的不同需求。VB對數(shù)據(jù)庫的處理有著強(qiáng)大的功能,在今后的系統(tǒng)開發(fā)中,應(yīng)進(jìn)一步對此加以研究應(yīng)用,使程序更優(yōu)化,用戶操作更便捷。
[1] 國家863中部軟件孵化器.Visual Basic從入門到精通[M].北京:人民郵電出版社,2010
[2] 高勇,符敢為.基于VC+ADO+Access的數(shù)據(jù)庫訪問技術(shù)在Pro/E環(huán)境下的實(shí)現(xiàn)[J] .機(jī)械設(shè)計(jì)與制造工程, 2013,42(3):14-17
[3] 董晶晶.基于VB與Access的人事信息管理系統(tǒng)設(shè)計(jì)[J].科技資訊, 2013(13):18-19
[4] 馮曉星,馬曉靜.VC基于ADO技術(shù)訪問Access數(shù)據(jù)庫[J].計(jì)算機(jī)與網(wǎng)絡(luò), 2013(8):54-56
[5] 賈保英.VB環(huán)境下ADO數(shù)據(jù)庫開發(fā)技術(shù)[J].中小企業(yè)管理與科技, 2013(24):286-287
[6] 衣文鳳,劉玫,王大鵬.Vb+Access在柴油機(jī)故障診斷系統(tǒng)界面記憶輸入中的程序設(shè)計(jì)[J]. 科技創(chuàng)新導(dǎo)報(bào), 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)
上海市自然科學(xué)基金(12ZR1415000)
陶佳琦(1987-), 男,上海,上海交通大學(xué)自動(dòng)化系,碩士研究生,研究方向:故障診斷,上海,200240
翁正新(1966-),男,江蘇,上海交通大學(xué)自動(dòng)化系,副教授,博士,研究方向:故障診斷與容錯(cuò)控制,上海,200240