在Wincc中使用Dapper读写数据库
Dapper是C#下的Micro ORM,极大简化了ADO.NET的查询操作。本应用将Dapper封装为一个COM组件,以便在Wincc中使用Dapper查询数据库。
安装
下载dll文件。
解压压缩包,运行“注册DLL.vbs”文件,提示“成功注册了类型”,即注册成功。
需要安装.NET Framework 4.8。
简单示例
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim endTime
endTime = SqlClient.ExecuteScalar("SELECT Max([TimeStampe]) from UA#Batch where [BatchName] = 'abcd'")
以上代码将自动连接到Wincc服务器的Wincc运行数据库,从UA#Batch
用户归档中查询结束时间并返回时间值。
执行SQL
ExecuteScalar
查询单个值。
原型:
object ExecuteScalar(string sql, object param = null, object transaction = null, int? commandTimeout = null)
示例:查询指定批次的结束时间
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim endTime
endTime = SqlClient.ExecuteScalar("SELECT Max([TimeStampe]) from UA#Batch where [BatchName] = 'abcd'")
Execute
执行SQL并返回受影响的行数。
原型:
int Execute(string sql, object param = null, object transaction = null, int? commandTimeout = null)
示例:删除数据
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
SqlClient.Execute("DELETE from UA#Batch where [BatchName] = 'abcd'")
Query
查询数据。
原型:
ArrayList Query(string sql, object param = null, object transaction = null, int? commandTimeout = null)
返回一个ArrayList
类型对象,其中的元素是HashTable
类型对象。
示例:查询批次
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim results
set results = SqlClient.Query("Select * from UA#Batch where [BatchName] = 'abcd'")
Dim r
For Each r in results
HMIRuntime.trace r("BatchName") & vbnewline
HMIRuntime.trace r("TimeStamp") & vbnewline
next
QueryFirst
获取第一个结果。如果查询结果为空则会引发异常。
原型:
Hashtable QueryFirst(string sql, object param = null, object transaction = null, int? commandTimeout = null)
返回一个HashTable
类型对象。
示例:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim result
set result = SqlClient.QueryFirst("Select * from UA#Batch where [BatchName] = 'abcd'")
HMIRuntime.trace result ("BatchName") & vbnewline
HMIRuntime.trace result ("TimeStamp") & vbnewline
QueryFirstOrDefault
获取第一个结果,如果数据为空则返回一个默认值。
原型:
Hashtable QueryFirstOrDefault(string sql, object param = null, object transaction = null, int? commandTimeout = null)
示例:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim result
set result = SqlClient.QueryFirstOrDefault("Select * from UA#Batch where [BatchName] = 'abcd'")
if not result is nothing then
HMIRuntime.trace result ("BatchName") & vbnewline
HMIRuntime.trace result ("TimeStamp") & vbnewline
end if
QuerySingle
获取第一个结果,如果查询为空或不止一行则抛出异常。
原型:
Hashtable QuerySingle(string sql, object param = null, object transaction = null, int? commandTimeout = null)
示例:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim result
set result = SqlClient.QuerySingle("Select * from UA#Batch where [BatchName] = 'abcd'")
HMIRuntime.trace result ("BatchName") & vbnewline
HMIRuntime.trace result ("TimeStamp") & vbnewline
QuerySingleOrDefault
获取第一个结果,如果数据为空则返回一个默认值,如果查询出不止一行则抛出异常。
原型:
Hashtable QuerySingleOrDefault(string sql, object param = null, object transaction = null, int? commandTimeout = null)
示例:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim result
set result = SqlClient.QuerySingleOrDefault("Select * from UA#Batch where [BatchName] = 'abcd'")
if not result is nothing then
HMIRuntime.trace result ("BatchName") & vbnewline
HMIRuntime.trace result ("TimeStamp") & vbnewline
end if
事务
原型:
TransactionWrapper BeginTransaction(IsolationLevel isolationLevel = IsolationLevel.Unspecified)
示例:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
Dim transaction
set transaction = SqlClient.BeginTransaction()
SqlClient.Execute("DELETE from UA#Batch where [BatchName] = 'abcd'", nothing, transaction)
transaction.Commit() ' 提交
'transaction.Rollback() '滚回
transaction.Dispose() '释放事务对象
在代码最后,需要用Dispose()
释放事务对象,否则要等待垃圾回收时才会释放事务对象,这将导致其他查询等待事务结束。
参数
方法的第二个参数是传入到SQL的参数,此功能尚未开发,仅作预留。
指定访问的数据库
默认访问Wincc 运行数据库,如果要访问其他数据库,使用以下代码:
访问Wincc运行数据库:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
sqlClient.UseWinccRtDatabase()
访问Wincc组态数据库:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
sqlClient.UseWinccRcDatabase()
访问指定的数据库:
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
sqlClient.UseDatabase("AuditDB")
连接其他数据源
默认连接到Wincc服务器数据库,如果要连接到其他数据源,则给UseDatabase
属性赋值。
Dim sqlClient
Set sqlClient = CreateObject("Wincc.SqlClientHelper")
sqlClient.ConnectionString = "Provider=MSOLEDBSQL.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=abcd"
连接到其他数据源时,不能使用UseWinccRtDatabase()
或UseWinccRcDatabase()
方法设置默认数据库,这两个方法获取本地Wincc的数据库。而要用UseDatabase()
指定默认数据库。