天天看點

wincc連接配接SQL Server控件ADO對象介紹ADO對象對象

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"