摘 要:介紹了在Labview中應(yīng)用ADO技術(shù)訪問(wèn)本地和遠(yuǎn)程數(shù)據(jù)庫(kù)的方案。對(duì)在局域網(wǎng)中以網(wǎng)絡(luò)共享方式訪問(wèn)遠(yuǎn)程Access數(shù)據(jù)庫(kù)進(jìn)行了詳細(xì)介紹,最后給出了應(yīng)用該方法開(kāi)發(fā)的一個(gè)實(shí)例。
關(guān)鍵詞:Labview ADO 遠(yuǎn)程數(shù)據(jù)庫(kù)
引言
Labview 是美國(guó)NI公司開(kāi)發(fā)的一種圖形化編程語(yǔ)言,其主要用于數(shù)據(jù)采集、儀器控制、過(guò)程監(jiān)控等領(lǐng)域。Labview具有豐富的采集與分析函數(shù)庫(kù),在Labview環(huán)境下可以方便快捷地開(kāi)發(fā)監(jiān)控系統(tǒng)軟件?,F(xiàn)代監(jiān)控系統(tǒng)一般構(gòu)建于局域網(wǎng)內(nèi),且監(jiān)控系統(tǒng)自身也是企業(yè)生產(chǎn)管理系統(tǒng)的一個(gè)子系統(tǒng),因此不可避免地要訪問(wèn)本地或遠(yuǎn)程數(shù)據(jù)庫(kù)。Labview開(kāi)發(fā)版中并沒(méi)有提供直接與通用數(shù)據(jù)庫(kù)接口的工具,但可以通過(guò)以下方法解決:購(gòu)買NI公司開(kāi)發(fā)的附加軟件工具包;利用其它語(yǔ)言如VC++編寫DLL訪問(wèn)數(shù)據(jù)庫(kù);利用ADO控件訪問(wèn)數(shù)據(jù)庫(kù)。[1]Labview支持Activex控件,與其它方法相比基于ADO技術(shù)構(gòu)建本地或遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)接口不失為一種簡(jiǎn)單而又經(jīng)濟(jì)的方法。
1 ADO技術(shù)簡(jiǎn)介
ADO(Activex Data Objects)是Microsot為OLE DB設(shè)計(jì)的應(yīng)用層接口,它為一致的數(shù)據(jù)訪問(wèn)接口提供了良好的擴(kuò)展性而不局限于單一的數(shù)據(jù)源。ADO接口編程模型中包括連接(connection)、命令(command)、參數(shù)(parameter)、記錄集(recordset)、字段(field)、錯(cuò)誤(error)、屬性(property)、集合(collection)、事件(event)等元素。其中connection、command、recordset是三個(gè)主體對(duì)象,parameters、fields、errors、properties、是四個(gè)集合對(duì)象。ADO的一般操作方式為:1 連接到數(shù)據(jù)源;2 指定訪問(wèn)數(shù)據(jù)源的命令;3 執(zhí)行命令;4 將命令執(zhí)行后產(chǎn)生的結(jié)果保存在緩存中;5 更新數(shù)據(jù)源。ADO接口繼承了OLE DB的高速性,可以高速訪問(wèn)本地或遠(yuǎn)程的數(shù)據(jù)源。
2在Labview 中使用ADO接口
在Labview 中使用ADO接口訪問(wèn)數(shù)據(jù)庫(kù)一般包括以下幾個(gè)步驟:建立ADO控件;連接到數(shù)據(jù)源;生成SQL命令;執(zhí)行命令;關(guān)閉連接。具體步驟如圖1 所示。
2.1建立ADO控件
在前面板控件模板中選擇Activex子模板單擊Automation Refnum項(xiàng),右鍵單擊Select Activex Class的Browse從類型庫(kù)中選擇Microsoft Activex Data Objects 2.7 library Version 2.7,之后可以向框圖程序中加入connection、command、recordset等對(duì)象。
2.2連接到數(shù)據(jù)源
首先在Diagram中單擊鼠標(biāo)右鍵,從Function模板選擇communication子模板,從中選擇Activex項(xiàng)的Automation Open 與ADODB_Connection相連即可打開(kāi)連接。接著同樣從communication子模板的Activex項(xiàng)中選擇Invoke node (方法節(jié)點(diǎn))并與Automation Open 相連,在其上單擊右鍵選擇methods項(xiàng)的Open方法即出現(xiàn)圖1中所示的節(jié)點(diǎn)。其中“Open”表示該節(jié)點(diǎn)為打開(kāi)“連接對(duì)象”,“ConnectionString”是連接到數(shù)據(jù)源的字符串, “UserID”和“Password”是連接到數(shù)據(jù)源的用戶名和密碼,左側(cè)小黑三角表示寫入,可以采用字符串控件或字符串常量為其賦值。
[align=center]
圖1 Labview 中訪問(wèn)數(shù)據(jù)庫(kù)[/align]
2.3生成SQL命令、執(zhí)行命令
采用與建立“打開(kāi)連接”方法相同的步驟建立執(zhí)行節(jié)點(diǎn),如圖1中所示:其中“Execute”右端的小三角表示讀出,“CommandText”表示需要執(zhí)行的SQL命令文本,該命令文本可由字符串控件或字符串常量賦值。如果需要執(zhí)行帶參數(shù)的命令,則可以采用Labview提供的“格式化字符串生成子VI”(format into string)來(lái)定制生成所需要的SQL命令文本。例如可以使用“Create”命令創(chuàng)建表,用“Drop”命令刪除表,用“Insert”命令向表中插入數(shù)據(jù),用“Select”命令進(jìn)行查詢并返回操作結(jié)果等(具體的操作命令格式可以參考相關(guān)的SQL語(yǔ)言手冊(cè))。RecordsAffected返回一個(gè)長(zhǎng)整型數(shù)值表示命令執(zhí)行后受影響的記錄集的數(shù)目。若要對(duì)執(zhí)行后的記錄進(jìn)行顯示或讀取字段值則需要建立“Recordset”對(duì)象,并與“Execute”相連然后再進(jìn)行相關(guān)的操作。
2.4關(guān)閉連接
對(duì)數(shù)據(jù)庫(kù)訪問(wèn)操作完畢后要及時(shí)關(guān)閉連接對(duì)象以釋放內(nèi)存和所用的系統(tǒng)資源。與建立連接對(duì)象的“Open”方法和“Execute”方法類似,先建立“Invoke Node ”選擇“Close”方法關(guān)閉連接,從“Function ”模板上單擊“Communication”子模板選擇“Activex”中的“Automation Close”項(xiàng)并連線。圖1中使用了一個(gè)順序結(jié)構(gòu),目的是為了使訪問(wèn)數(shù)據(jù)庫(kù)按一定的順序運(yùn)行,不致發(fā)生命令尚未執(zhí)行完畢而關(guān)閉連接的錯(cuò)誤。
3 訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)
在Labview中訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)的途徑有以下幾種:(1)采用NI公司開(kāi)發(fā)的數(shù)據(jù)庫(kù)訪問(wèn)軟件包實(shí)現(xiàn)對(duì)本地或遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn),該軟件包需單獨(dú)購(gòu)買。;(2)基于RDS技術(shù)構(gòu)建客戶端/服務(wù)器的遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)模式,該方案要求系統(tǒng)有數(shù)據(jù)庫(kù)服務(wù)器如SQL Server 等,同時(shí)也要求對(duì)ADO RDS技術(shù)有深入的了解;(3)通過(guò)Web控件訪問(wèn)數(shù)據(jù)庫(kù)訪問(wèn)頁(yè)模式。這種方案以網(wǎng)頁(yè)瀏覽的方式交互的訪問(wèn)數(shù)據(jù)庫(kù)訪問(wèn)頁(yè),對(duì)于監(jiān)測(cè)系統(tǒng)而言其實(shí)時(shí)性難以滿足,同時(shí)也需要借助其它語(yǔ)言如VBscript或JavaScript等。如需要訪問(wèn)SQL Server則在連接字符串中設(shè)定相應(yīng)的數(shù)據(jù)源以及遠(yuǎn)程計(jì)算機(jī)名和所要訪問(wèn)的數(shù)據(jù)庫(kù)名即可實(shí)現(xiàn)??紤]到目前監(jiān)控系統(tǒng)大多處于局域網(wǎng)內(nèi)且系統(tǒng)要求實(shí)時(shí)、高速地訪問(wèn)數(shù)據(jù)庫(kù),在Labview中以訪問(wèn)共享文件或網(wǎng)絡(luò)驅(qū)動(dòng)器中的遠(yuǎn)程數(shù)據(jù)庫(kù)的方式實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)因其簡(jiǎn)單、經(jīng)濟(jì)而具有較高的實(shí)際意義。在局域網(wǎng)內(nèi)以共享文件方式訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)的具體作法是在遠(yuǎn)程計(jì)算機(jī)中將數(shù)據(jù)庫(kù)所在的文件夾或驅(qū)動(dòng)器設(shè)為共享,在本地計(jì)算機(jī)應(yīng)用程序中對(duì)遠(yuǎn)程計(jì)算機(jī)中的數(shù)據(jù)庫(kù)文件進(jìn)行讀寫、查詢等操作。所有的操作均在本地計(jì)算機(jī)中進(jìn)行,遠(yuǎn)程計(jì)算機(jī)實(shí)際上只提供文件服務(wù),因此要求本地機(jī)處理器有較強(qiáng)的能力。[2]
3.1本地連接字符串設(shè)定
訪問(wèn)本地?cái)?shù)據(jù)庫(kù)時(shí)根據(jù)是否提供ODBC支持可以分為兩種情況:(1)通過(guò)ODBC DSN 連接;首先要在控制面板的“ODBC數(shù)據(jù)源”中設(shè)定數(shù)據(jù)源名稱并指定要訪問(wèn)的數(shù)據(jù)庫(kù)。然后將“DSN=數(shù)據(jù)源名稱”寫入“ConnectionString”。通過(guò)ODBC DSN 連接必須預(yù)先在控制面板中進(jìn)行設(shè)定,而且應(yīng)用程序只能訪問(wèn)特定的數(shù)據(jù)源,因此對(duì)程序移植和使用有一定影響。(2)無(wú)ODBC DSN 連接;以連接到Access 數(shù)據(jù)庫(kù)為例,向“ConnectionString”中寫入以下字符串“Driver={Microsoft Access Driver(*.mdb)};Dbq=c:\somepath\mydb.mdb;Uid=admin;Pwd=”,其中“Driver”指定數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,“Dbq”指定要訪問(wèn)的數(shù)據(jù)庫(kù)的路徑;“Uid”和“Pwd”指定訪問(wèn)數(shù)據(jù)庫(kù)時(shí)的用戶名和密碼。無(wú)ODBC DSN連接可以在程序中根據(jù)需要隨時(shí)指定數(shù)據(jù)源以及所需使用的驅(qū)動(dòng)程序無(wú)需在控制面板中手動(dòng)設(shè)置,這種方式便于程序移植和使用。
[align=center]
圖2向遠(yuǎn)程數(shù)據(jù)庫(kù)寫入數(shù)據(jù)實(shí)例[/align]
3.2遠(yuǎn)程連接字符串設(shè)定
訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)步驟與訪問(wèn)本地?cái)?shù)據(jù)庫(kù)基本類似,差別之處在于數(shù)據(jù)源的設(shè)定有所不同。在網(wǎng)絡(luò)共享上訪問(wèn)Access 數(shù)據(jù)庫(kù)時(shí)要在“ConnectionString”中指定數(shù)據(jù)源提供者為Microsoft Jet OLEDB Provider,應(yīng)向“ConnectionString”中寫入以下字符串“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\mysever\myshare\mypath\mydb.mdb”其中“Provider”指定數(shù)據(jù)源提供者,“Data Source”指定數(shù)據(jù)庫(kù)的路徑?!癿ysever”是遠(yuǎn)程計(jì)算機(jī)名或遠(yuǎn)程計(jì)算機(jī)的IP地址?!癿yshare”是共享文件夾的名稱,“mypath”是數(shù)據(jù)庫(kù)文件的相對(duì)路徑,“mydb.mdb”是被訪問(wèn)的遠(yuǎn)程數(shù)據(jù)庫(kù)名稱。在確認(rèn)上述各項(xiàng)設(shè)定正確無(wú)誤且遠(yuǎn)程計(jì)算機(jī)共享打開(kāi)后就可以向該遠(yuǎn)程數(shù)據(jù)庫(kù)進(jìn)行各項(xiàng)操作了。[3]
3.3訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)實(shí)例
本實(shí)例由一個(gè)數(shù)據(jù)采集子VI采集生產(chǎn)現(xiàn)場(chǎng)一組數(shù)據(jù),并將這些數(shù)據(jù)存在一個(gè)全局?jǐn)?shù)組中,然后采用如圖2所示的框圖程序通過(guò)局域網(wǎng)絡(luò)向名為“myserver”計(jì)算機(jī)中的一個(gè)Accesss數(shù)據(jù)庫(kù)文件寫入數(shù)據(jù)。該文件名為“sampledatabase”位于共享名為“123”的文件夾中,“mytable”是該數(shù)據(jù)庫(kù)文件的一個(gè)表格文件。由于要向表格中寫入一組數(shù)據(jù),因此使用一個(gè)“for loop”結(jié)構(gòu)并利用其對(duì)數(shù)組自動(dòng)索引功能通過(guò)“format into string”子VI生成SQL命令文本依次向表格中寫入數(shù)據(jù)。經(jīng)過(guò)一次循環(huán)可以向數(shù)據(jù)庫(kù)中添加一條記錄,該記錄包含兩個(gè)字段:數(shù)據(jù)編號(hào)和數(shù)據(jù)值。如果是連續(xù)采集則可以將上述的程序置于一個(gè)“while”循環(huán)結(jié)構(gòu)中,定時(shí)調(diào)用數(shù)據(jù)寫入程序即可實(shí)現(xiàn)連續(xù)保存數(shù)據(jù)。對(duì)于從遠(yuǎn)程計(jì)算機(jī)中讀取數(shù)據(jù)庫(kù)文件也可采用類似的方法,在此不再贅述。
4 結(jié)論
實(shí)際證明,在Labview中基于ADO技術(shù)構(gòu)建局域網(wǎng)環(huán)境下的,以網(wǎng)絡(luò)共享方式實(shí)現(xiàn)對(duì)本地或遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)可以充分利用ADO的各種屬性和方法,無(wú)需使用其它編程語(yǔ)言,無(wú)需增加系統(tǒng)成本,直接在Labview中實(shí)現(xiàn)高速、實(shí)時(shí)地訪問(wèn)數(shù)據(jù)庫(kù),是一種簡(jiǎn)單、經(jīng)濟(jì)而又具有實(shí)際意義的遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)方法。
參考文獻(xiàn)
[1]楊樂(lè)平等,Labview高級(jí)程序設(shè)計(jì)[M].清華大學(xué)出版社.2003.457-465
[2] 紀(jì)淑娟,蘇蕊,梁永全.利用ADO方法在C/S模式下實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)訪問(wèn)[J]. 山東科技大學(xué)學(xué)報(bào),2003,22(1):73-75
[3]肖桂東等, SQL Server疑難解析[M].電子工業(yè)出版社.2003.316-325