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"