摘 要: 介紹了采用SQL數(shù)據(jù)庫(kù),,分別在Webaccess腳本、VB采集程序和Delphi的檢測(cè)程序中調(diào)用,,解決大量數(shù)據(jù)的流通及存儲(chǔ)的問(wèn)題,。
關(guān)鍵詞: Webaccess;數(shù)據(jù)庫(kù),;SQL,;ADO;ODBC
某空調(diào)通風(fēng)試驗(yàn)臺(tái)以Webaccess作為軟件平臺(tái),,用于采集測(cè)點(diǎn)數(shù)據(jù),、執(zhí)行算法并輸出控制信號(hào)。但在空調(diào)通風(fēng)試驗(yàn)臺(tái)的項(xiàng)目中,,風(fēng)速,、壓力和溫度總共有140個(gè)采集點(diǎn),如果采用Webaccess內(nèi)部點(diǎn),,無(wú)法進(jìn)行存儲(chǔ),。因?yàn)檫@些點(diǎn)的數(shù)據(jù)要被實(shí)時(shí)地保存。為此,,本文介紹了基于Webaccess平臺(tái),、采用SQL sever作為本工程節(jié)點(diǎn)的數(shù)據(jù)保存數(shù)據(jù)庫(kù),同時(shí)也考慮了可以方便其他局域網(wǎng)的應(yīng)用程序訪問(wèn)本機(jī)上的數(shù)據(jù),,以作為分析的依據(jù),。
在本系統(tǒng)中,應(yīng)用程序訪問(wèn)SQL數(shù)據(jù)庫(kù)通過(guò)ODBC或ADO兩種方式,。ODBC是微軟開(kāi)發(fā)的數(shù)據(jù)庫(kù)編程接口,,應(yīng)用程序可以通過(guò)ODBC訪問(wèn)來(lái)自不同數(shù)據(jù)庫(kù)管理系統(tǒng)的數(shù)據(jù)。在Windows系統(tǒng)中,,包含有ODBC接口的管理程序,,如果要使用ODBC數(shù)據(jù)源,必須首先創(chuàng)建和配置數(shù)據(jù)源,。ODBC管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫(kù)的位置,、數(shù)據(jù)庫(kù)的類(lèi)型和ODBC驅(qū)動(dòng)程序,建立與數(shù)據(jù)庫(kù)的連接,,應(yīng)用程序?qū)?shù)據(jù)庫(kù)的操作通過(guò)ODBC完成,。ADO是微軟提供的一種面向各種數(shù)據(jù)源的高級(jí)接口,開(kāi)發(fā)人員只需編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼而不用去關(guān)心如何去實(shí)現(xiàn),即只要關(guān)心和數(shù)據(jù)庫(kù)的連接,;ADO通過(guò)OLE DB訪問(wèn)和操作數(shù)據(jù)庫(kù)服務(wù)器中的數(shù)據(jù),,通過(guò)ADO可以連接數(shù)據(jù)庫(kù),并且指定訪問(wèn)數(shù)據(jù)源的命令,,最后執(zhí)行命令,。
在本系統(tǒng)中,連接一個(gè)本地SQLserver,,并在這個(gè)服務(wù)器中建立了一個(gè)shuju數(shù)據(jù)庫(kù),,這個(gè)數(shù)據(jù)庫(kù)含有10個(gè)數(shù)據(jù)表,分別為:1個(gè)存儲(chǔ)修正值的表,,3個(gè)實(shí)時(shí)的數(shù)據(jù)保存數(shù)據(jù)表,,3個(gè)數(shù)據(jù)坐標(biāo)直接讀取表和3個(gè)歷史坐標(biāo)存儲(chǔ)總表。Webaccess在采集數(shù)據(jù)之后,,存入數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)再把數(shù)據(jù)分享到局域網(wǎng),。整個(gè)系統(tǒng)的數(shù)據(jù)流向圖如圖1所示,。
1 通過(guò)ODBC訪問(wèn)數(shù)據(jù)庫(kù)
在Windows系統(tǒng)中,采用Webaccess作為軟件平臺(tái),,其本身支持對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě),但需要在Windows的ODBC管理器中添加ODBC數(shù)據(jù)源。在Windows XP系統(tǒng)的控制面板的管理工具中,,數(shù)據(jù)源管理器中添加SQL server驅(qū)動(dòng),、命名、選擇服務(wù)器,,然后添加數(shù)據(jù)庫(kù)shuju,,測(cè)試連接即完成。每次在腳本中執(zhí)行SQL語(yǔ)句,、進(jìn)行操作數(shù)據(jù)庫(kù)之前,,必先連接數(shù)據(jù)源。下面介紹如何連接shuju數(shù)據(jù)庫(kù),、讀寫(xiě)存儲(chǔ)溫度的數(shù)據(jù)表TDATATABLE和存儲(chǔ)矯正值的數(shù)據(jù)表xiuzheng,。
(1)在xiuzheng數(shù)據(jù)表中存儲(chǔ)了在Webaccess中對(duì)每個(gè)點(diǎn)的傳感器數(shù)據(jù)的矯正值,,每當(dāng)每個(gè)點(diǎn)的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)之前,,必須讀取xiuzheng表中的矯正值,加到讀入的數(shù)據(jù)值上,。其代碼如下:
SQLDIRECT”CONNECT SESSION 1 TO shuju,,sa,”
#建立與數(shù)據(jù)庫(kù)的連接,用戶(hù)名為sa,,密碼為空[1]
SQLDIRECT "USE SESSION 1" #使用連接
SQLPREPARE "DECLARE C1 CURSOR FOR "
#這一條語(yǔ)句從數(shù)據(jù)庫(kù)flag=1處讀取,,并記錄到緩存
SQLPREPARE"SELECTTO1,TO2,,TO3,,TO4,TO5,,TO6,,TO7,TO8,,TO9,,TO10,"
…...
SQLPREPARE "TO51,,TO52,,TO53,TO54,,TO55,,TO56,TO57,,TO58,,TO59,TO60"
SQLPREPARE "FROm xiuzheng WHERE Flag=1"
SQLEXECUTE #sql語(yǔ)句執(zhí)行
SQLDIRECT "OPEN C1"
#將緩存中的數(shù)據(jù)讀取到本地點(diǎn)中
SQLPREPARE "FETCH NEXT C1 INTO m1,,m2,,m3,m4,,m5,,m6,m7,,m8,,m9,m10,,"
……
SQLPREPARE"m51,,m52,m53,,m54,,m55,m56,,m57,,m58,,m59,m60"
SQLEXECUTE
SQLDIRECT "CLOSE C1" #關(guān)閉連接
set m1 [expr $m1+[GETVAL TT1]]
#將驅(qū)動(dòng)讀取到傳感器的數(shù)據(jù)加上矯正值
set m2 [expr $m2+[GETVAL TT2]]
……
set m60 [expr $m60+[GETVAL VV60]]
?。?)將讀到的傳感器測(cè)量的點(diǎn)的數(shù)值加上矯正值存儲(chǔ)到TDATATABLE,。其代碼如下:
SQLDIRECT”CONNECT SESSION 1 TO shuju,sa,,”
#連接數(shù)據(jù)庫(kù)
SQLDIRECT”USE SESSION 1”
SQLPREPARE”INSERT INTO TDATABASE VALUES(”SQLPREPARE”'[GETVAL %TI
MDATE]',,'[GETVAL %TTMTIME]'”
SQLPREPARE” $m1,$2,, $m3,,$m4,$m5,,”
……
SQLPREPARE”$m56,,$m57,$m58,,$59,,$m60)”
#將系統(tǒng)日期,時(shí)間和局部點(diǎn)讀取到TDATEBASE數(shù)據(jù)表中
SQL.EXECUTE
SQLDIRECT”DISCONNECT SESSION1”
2 通過(guò)ADO接口連接到數(shù)據(jù)庫(kù)
?。?)在Webaccess中局部點(diǎn)存儲(chǔ)了坐標(biāo)值,,只有當(dāng)局部點(diǎn)文件被加載時(shí)才能把這些點(diǎn)賦值。本文采用在Webaccess的總體腳本中添加VB輔助程序,、運(yùn)行總體腳本時(shí)在VB程序中給這些局部點(diǎn)賦值。
在VB輔助程序中,,VB控件作為第三方控件在Webaccess平臺(tái)中實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的連接,。由于嵌入到Webaccess中的控件是通過(guò)bwocxrun.exe與Webaccess通信,因此要把bwocx.ocx引用到VB中,。在VB中新建ActiveX控件—>工程—>部件bwocxrun ActiveX Control modole—>接口向?qū)?mdash;>hWnd—>映射到UserControl—>數(shù)據(jù)類(lèi)型為string—>在空白處添加ocx控件,。
在VB控件中建立與SQL數(shù)據(jù)庫(kù)的連接,本系統(tǒng)采用ADO連接數(shù)據(jù)庫(kù),,而在VB中采用ADO接口,。主要有兩種方式:一是采用ADOdata控件連接數(shù)據(jù)庫(kù),二是采用ADO對(duì)象與數(shù)據(jù)庫(kù)連接,。在采用第二種方式時(shí)還有兩種方式:分別是ADO對(duì)象和ODBC數(shù)據(jù)源連接或者ADO對(duì)象和指定的OLE DB提供者連接數(shù)據(jù)庫(kù),。本文采用ADO對(duì)象和指定的OLE DB連接方式。以下是與TXYZTABLE的連接:
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private sub form_load()
Set conn=New ADODB.Connection
Set rs=New ADODB.Recordset
Dim s1,,s2 As String
Dim ft1,,ft2…..as byte
Dim xt1,yt1,,zt1…as single
conn.ConnectionString=”driver={sqlserver},;server=127.0.0.1,;uid=sa;pwd=,;Connection Timeout=0,;Database=shuju”
′與數(shù)據(jù)庫(kù)建立連接的字符串[2]
conn.open ′建立與數(shù)據(jù)的連接
ft1=Bwocxrun1.GetValue(“FT1”,ME.AP)
′通過(guò)Bwocxrun控件將Webaccess中的點(diǎn)讀到VB中的變量[3]
xt1=Bwocxrun1.GetValue(“XT1”,,ME.AP)
yt1=Bwocxrun1.GetValue(“YT1”,,ME.AP)
zt1=Bwocxrun1.GetValue(“ZT1”,ME.AP)
……..
S1=”USE shuju”
conn.Execute s1
s2=”INSERT INTO TXYZTABLE VALUES(1,,”&ft1&”’,,’”&xt1&”’,’”&yt1&”’,,’”&zt1&”,,’……’)”
conn.Exexute s2
′將這些變量存儲(chǔ)到shuju數(shù)據(jù)庫(kù)的TXYZTABLE表中
(2)在本系統(tǒng)中,,由于如果改變測(cè)點(diǎn)額定坐標(biāo),,將會(huì)使以前的坐標(biāo)信息全部丟失。為了存儲(chǔ)過(guò)去的歷史坐標(biāo),,系統(tǒng)建立了一個(gè)歷史坐標(biāo)數(shù)據(jù)表,。利用Delphi編寫(xiě)了一個(gè)輔助程序?qū)?dāng)前的測(cè)點(diǎn)坐標(biāo)存儲(chǔ)到數(shù)據(jù)庫(kù)中,當(dāng)測(cè)量點(diǎn)修改后,,可以運(yùn)行該程序?qū)⒏膭?dòng)的坐標(biāo)存儲(chǔ)到歷史坐標(biāo)數(shù)據(jù)庫(kù)中,。當(dāng)在使用以前的測(cè)量點(diǎn)時(shí),也可以在程序中選擇以前存儲(chǔ)的歷史坐標(biāo)加載到測(cè)量點(diǎn)的局部點(diǎn),。
使用Delphi編寫(xiě)試驗(yàn)坐標(biāo)處理程序時(shí),,其程序采用ADO數(shù)據(jù)庫(kù)訪問(wèn)接口進(jìn)行連接數(shù)據(jù)庫(kù),采用ODBC驅(qū)動(dòng)程序連接數(shù)據(jù)源,。圖2為該程序的界面,。
在編寫(xiě)程序時(shí),需要在新建的窗體上添加ADOConnection和ADOQUERY控件,。其中這ADOConnection的connectionstring屬性為”Provider=MSDASQL.1,;Persist Security Info=False;User ID=sa,;Data Source=shuju”,,并為ADOQUERY添加connection屬性為ADOConnection的name[4]。
在MPXYZTABLE中,,每一條記錄的第一個(gè)字段表示第幾條實(shí)驗(yàn)記錄,。下面是以壓力歷史坐標(biāo)表演示將數(shù)據(jù)編號(hào)讀出,并將選擇的編號(hào)的數(shù)據(jù)記錄讀取到坐標(biāo)數(shù)據(jù)表的示例:
ADOQuery1.Close,;
ADOQuery1.SQL.Clear,;
ADOQuery1.SQL.Add(′SELECT*FROM MPXYZTABLE′),; //連接數(shù)據(jù)庫(kù)選擇數(shù)據(jù)表
ADOQuery1.Open; //打開(kāi)數(shù)據(jù)表
j:= ADOQuery1.RecordCount,;
……
ADOQuery1.FindFirst,;
for i:=0 to j-2 do
begin ComboBox1.Items.Add(ADOQuery1.Fields[0].Value); //將編號(hào)提取到下拉控件中顯示
testname[i]:=ADOQuery1.Fields[0].Value,;
ADOQuery1.FindNext,; //下一條記錄
下面是把歷史坐標(biāo)中選擇的編號(hào)相應(yīng)的記錄輸出到全局變量中,然后把這些變量再寫(xiě)入到坐標(biāo)表中的代碼:
ADOQuery1.Close,;
ADOQuery1.SQL.Clear,;
ADOQuery1.SQL.Add(′SELECT*FROM MTXYZTABLE WHERE FLAG=′′′+ComboBox1.Text+′′′′);
ADOQuery1.Open,;
for i:=1 to 240 do
begin
if ADOQuery1.Fields[i].Value=NULL then
//檢測(cè)記錄是否為空
begin
data[i]:=0,;
end
else
data[i]=ADOQuery1.Fields[i].Value;
//把MTXYZTABLE中的數(shù)據(jù)讀到數(shù)組中
end,;
ADOQuery1.Close,;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(′update TXYZTABLE setFLAG=′′′+inttostr(1)+′′′,,F(xiàn)T1=′′′+floattostr(data[1])+′ ′′,,XT1=′′′+floattostr(data[2])+′′′,YT1=′′′+floattostr(data[3])+′′′,,ZT1=′′′+floattostr(data[4])+′′′,,′ ),;
……
ADOQuery1.SQL.Add(′FT2=′′′+floattostr(data[57])+′′′,,XT2=′′′+floattostr(data[58])+′′′,YT2=′′′+floattostr(data[59])+′′′,,ZT2=′′′+floattostr(data[60])+′′′,′),;
//把數(shù)組中的值寫(xiě)入到坐標(biāo)數(shù)據(jù)表TXYZTABLE
以上就是在Webaccess中SQL數(shù)據(jù)庫(kù)的調(diào)用和操作,。在實(shí)際的應(yīng)用中只要掌握簡(jiǎn)單的查詢(xún)語(yǔ)句,就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,。
參考文獻(xiàn)
[1] 研華(中國(guó))公司自動(dòng)化事業(yè)群.Advantech WebAccess產(chǎn)品使用手冊(cè)[S].2009.
[2] 陳艷峰,,高文姬,邵蘊(yùn)秋,,等.Visul Basic 數(shù)據(jù)庫(kù)項(xiàng)目案例導(dǎo)航[M].北京:清華大學(xué)出版社,,2004.
[3] 劉德生,張?zhí)扉_(kāi).基于VB的WebAccess組態(tài)功能擴(kuò)展[J].微型機(jī)與應(yīng)用,,2011,,30(12):29.
[4] 鄭阿奇.Delphi實(shí)用教程[M].北京:電子工業(yè)出版社,,2006.