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"