ADO控件作為wincc和資料庫連接配接的控制之一。本文主要介紹ADO控件在wincc中的使用
ADO對象
ActiveX 資料對象(ActiveX Data Objects)是通路資料庫中資料的程式設計接口。
使用時可通過CreateObject函數建立虛拟對象。然後調用虛拟化後的對象屬性、方法實作資料庫的連接配接、讀寫等操作
Dim conn,Ors,Comm
Set conn = CreateObject("ADODB.Connection") 'Connection對象
Set Ors = CreateObject("ADODB.Recordset") 'ADODB.Recordset對象
Set comm = CreateObject("ADODB.Command") 'ADODB.Command指令對象
對象
常用的對象主要有ADO Connection、ADO Command、ADO Recordset.對應每個對象都要方法和屬性等。
Connection
open方法
打開連接配接。連接配接為微軟的SQL資料庫驅動程式(Provider),以及此資料庫在計算機上的實體路徑。
Scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" & Dbname & "';Data Source = " & PCname & "\WINCC"
Set Conn=CreateObject("ADODB.Connection")
Conn.ConnectionString=scon
Conn.Cursorlocation=3
Conn.open
Close方法
關閉連接配接。每當打開一個連接配接,必須關閉一個連接配接。
Scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" & Dbname & "';Data Source = " & PCname & "\WINCC"
Set Conn=CreateObject("ADODB.Connection")
Conn.ConnectionString=scon
Conn.Cursorlocation=3
Conn.open
'資料庫的查詢、修改等操作'
Conn.close
Command
執行面向資料庫的一次簡單查詢。此查詢可執行諸如建立、添加、取回、删除或更新記錄等動作。
如果該查詢用于取回資料,此資料将以一個 RecordSet 對象傳回。這意味着被取回的資料能夠被 RecordSet 對象的屬性、集合、方法或事件進行操作。
其常用屬性包括:
屬性 | 描述 |
---|---|
ActiveConnection | 使打開的資料庫連接配接與Command對象關聯 |
CommandText | 可執行的指令文本,如SQL語句。 |
CommandType | 指定指令類型以優化性能,如果CommandText類型為SQL,值為1 |
CommandTimeout | 設定提供者等待指令行的秒數.一般不使用 |
'下面程式為資料庫執行SQL的資料更新語句,但在執行下面程式時,需要将連接配接資料庫,具體可參看文末案例
Set Ocom=CreateObject("ADODB.Command")
Ocom.commandtype=1
Ocom.ActiveConnection=conn
Ocom.CommandText=sqlstr 'sqlstr代表SQL語句,此處主要是查詢語句
Ocom.Execute '屬于Command的方法,用于執行CommandText屬性中的指令文本
Set Ocom=Nothing
Set Conn=Nothing
當執行SQL語句取回資料時,此資料将以一個RecordSet對象傳回。傳回的資料能夠被RecordSet對象的屬性、集合、方法或事件進行操作。這裡暫不舉例,具體可參考下面的RecordSet對象。
RecordSet
常用屬性:
屬性 | 描述 |
---|---|
RecordsetCount | 傳回目前記錄的數目 |
BOF | 表示目前記錄位于該對象第一個記錄之前 |
EOF | 表示目前記錄位于該對象最後一個記錄之後 |
movefirst | 移動到第一條 |
movenext | 移動到下一條 |
movelast | 移動到最後一條 |
Dim conn,oCom,oRs
Dim fieldcount,m
Set conn = CreateObject("ADODB.Connection")
conn.CursorLocation = 3
Scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" & Dbname & "';Data Source = " & PCname & "\WINCC"
conn.Open
Set oRs = CreateObject("ADODB.Recordset")
Set oRs=conn.Execute("ALARMVIEW:Select * FROM AlgViewCHT ")
m = oRs.RecordCount
fieldcount=Rs.fields.count '傳回 fields 集合中項目的數目。以 0 起始。
msgbox "報警行數"&m
conn.close
Error
ADO Error 對象包含與單個操作(涉及提供者)有關的資料通路錯誤的詳細資訊。
ADO 會因每次錯誤産生一個 Error 對象。每個 Error 對象包含具體錯誤的詳細資訊,且 Error 對象被存儲在 Errors 集合中。要通路這些錯誤,就必須引用某個具體的連接配接。
'此段代碼主要用于如果在執行ADO對象的操作時,當錯誤代碼不是0,則将錯誤資訊記錄,當錯誤代碼為8001,則記錄錯誤資訊,但也顯示資料查詢完成資訊。其中錯誤代碼8001代表無法打開與SQL的連接配接'
If err.number<>0 Then
out_err_number=err.number
out_err_source=CStr(err.source)
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & err.description
err.clear
out_state=False
Else
out_err_number=8001
out_err_source="sqlselectcheck"
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & "資料查詢加完成!"
out_state=True
End If
代碼展示
查詢傳回資料
On Error Resume Next
Dim Rs,Ocom,Scon,Conn
Dim PCName
Dim DT
Dim DT_Year,DT_Month,DT_Day,DT_Hour,DT_Minute,DT_Second
Dim sqlstr
Dim recordcount
Scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" & in_dbname & "';Data Source = " & in_pcname & "\WINCC"
Set Conn=CreateObject("ADODB.Connection")
Conn.ConnectionString=scon
Conn.Cursorlocation=3
Conn.open
'Msgbox "建立資料記錄集對象"
Set Rs=CreateObject("ADODB.RecordSet")
'Msgbox "建立資料指令對象"
Set Ocom=CreateObject("ADODB.Command")
Ocom.commandtype=1
Set Ocom.ActiveConnection=conn
sqlstr ="ALARMVIEW:Select * FROM AlgViewCHT "
Ocom.CommandText= sqlstr
'Msgbox "資料指令執行"
Set Rs=Ocom.Execute
recordcount=Rs.RecordCount
Set Ocom=Nothing
Set Rs=Nothing
Conn.Close
Set Conn=Nothing
If err.number<>0 Then
'Msgbox "error code:" & CStr(err.number) & "error source:" & CStr(err.source) & "error description:" & err.description
out_err_number=err.number
out_err_source=CStr(err.source)
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & err.description
err.clear
out_state=False
Else
out_err_number=8001
out_err_source="sqlselectcheck"
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & "資料查詢加完成!"
out_state=True
End If
更新資料
On Error Resume Next
Dim Rs,Ocom,Scon,Conn
Dim PCName
Dim DT
Dim DT_Year,DT_Month,DT_Day,DT_Hour,DT_Minute,DT_Second
Dim sqlstr
Scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" & in_dbname & "';Data Source = " & in_pcname & "\WINCC"
Set Conn=CreateObject("ADODB.Connection")
Conn.ConnectionString=scon
Conn.Cursorlocation=3
Conn.open
Set Ocom=CreateObject("ADODB.Command")
Ocom.commandtype=1
Ocom.ActiveConnection=conn
sql = "UPDATE DBTable set " & Number & "='" & 3"
Ocom.CommandText=sqlstr
Ocom.Execute
out_recordcount=1
Set Ocom=Nothing
Conn.Close
Set Conn=Nothing
If err.number<>0 Then
out_err_number=err.number
out_err_source=CStr(err.source)
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & err.description
err.clear
out_state=False
Else
out_err_number=8001
out_err_source="sqlupdate"
out_err_description="code:" & CStr(out_err_number) & ",source" & out_err_source & ",description:" & "資料表格更新完成!"
out_state=True
End If
最後在編寫此篇文章時,查詢西門子手冊,關于wincc過程值歸檔、報警歸檔和使用者歸檔的腳本整理如下:
過程值歸檔:
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
Set oCom.ActiveConnection = conn
oCom.CommandText = "TAG:R,'PVArchive\Tag1','0000-00-00 00:10:00.000','0000-00-00 00:00:00.000'"
報警消息歸檔:
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
Set oCom.ActiveConnection = conn
oCom.CommandText = "ALARMVIEW:Select * FROM AlgViewEnu"
使用者歸檔
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
oCom.CommandType = 1
Set oCom.ActiveConnection = conn
oCom.CommandText = "SELECT * FROM UA#Test"