ihd OLEDB provider
1.概述
OLE DB是微软的开发的一种基于COM的数据库技术,它是通向不同的数据源的低级应用程序接口。OLE DB和其他 Microsoft 数据库技术的不同之处在于其提供通用数据访问的方式,不仅包括微软资助的标准数据接口、开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。
2.OLE DB基于COM标准
OlEDB是基于COM的一种技术,因此呈现程序语言的多样特性,可支持c++,vbscript等语言,因此可以将OLEDB技术用来在组态系统,从而访问实时数据库的数据。
3.安装
一般客户端安装程序会自动注册 hdOLEDB.dll。
在注册表中查看dll是否被注册
(1)运行Win + R,在标签中输入regedit并确定打开注册编辑器;
(2)在HKEY_CLASSES_ROOT目录下,查找是否有”Ihd.ihd.1”存在,如果存在则说明注册成功。
如果没有自动注册成功,需要手工注册:
在hdOLEDB.dll目录下运行命令行
regsvr32 hdOLEDB.dll
4.连接准备
OLEDB提供程序用于访问我们的实时数据库,因此用户在使用Oledb时应该保证实时数据库的服务已经启动,在系统管理工具中可以正常查询数据。
5.SQL语句使用说明
OLEDB 提供程序的SQL语句,与ODBC驱动的SQL语句相同,详情请参考:ODBC Driver
6.Oledb提供接口说明
Oledb支持直接传入SQL语句进行查询,直接提供字段,时间,表名,查询记录条数作为参数进行查询。在调用接口之前需要生成dll的一个对象实例,通过对象来调用相应的接口,具体操作如下:
(1)生成对象
IMyclass * pMyclass = NULL;
IHyperDB * pIHyperdb = NULL;
HRESULT hr = CoInitilize(NULL);
hr = CoCreateInstance(CLSID_MyClass, NULL, 1, IID_IMyClass, (void **) &pMyClass);
现在已经生成了一个对象,利用对象pMyClass进行接口访问。
(2)数据库连接接口
ConnectToDB(BSTR szIP, LONG nPort, BSTR szBakIP, LONG nBakPort, LONG Timeout, BSTR UserID, BSTR Passward, LONG *nRetErr)
本接口实现了数据库的连接与登录过程,因此数据库连接需要用户传入访问的数据库IP,PORT,以及登录所用的用户名和密码等信息进行数据库的访问。
(3)执行SQL语句
GetSQL(BSTR GetsqlPt, VARIANT *rows)
本接口通过传入一个Sql语句进行数据的查询,rows是查询事需要返回的数据记录条数
(4)获取结果集
GetRowSets(_RETURNRESULT** pRet,LONG* rows,LONG *nRetErr)
本接口将查询结果返回,pRet是要输出的结果集,一条记录用pRet的一行表示,rows是查询的数据记录条数,该接口可以直接将节点查询的所有字段结果输出,包含普通字段和内置函数字段。
(5)获取普通字段结果集
Get_CommonTag_Rowsets(VARIANT *retftag,VARIANT *retftime,VARIANT *retfquality, VARIANT * retfivalue,VARIANT *retffvalue, VARIANT * retfsvalue,VARIANT *retftagtype, VARIANT *retftimestep,VARIANT *retfintertype)
本接口将查询的字段如tagName,ftime等结果进行输出,注意该接口不返回具有内置函数的的字段
(6)获取内置函数字段结果集
Get_Buildin_Func_Rowsets(VARIANT *retMinfivalue, VARIANT *retMaxfivalue,VARIANT *retAveragefivalue,VARIANT * retCountfivalue, VARIANT * retSumfivalue, VARIANT *retMinffvalue, VARIANT *retMaxffvalue,VARIANT *retAverageffvalue,VARIANT * retCountffvalue, VARIANT * retSumffvalue)
本接口将支持内置函数的字段fivalue,ffvalue的相应结果输出,如最大、最小、平均、统计、求和,注意该接口只返回这两个字段的内置函数值
(7)断开数据库连接
Disconnect()
本接口断开数据库的连接,并进行连接句柄的释放,并且将查询结果的内存空间进行释放
7. 组态脚本示例
//链接与断开测试
Sub BSButton1_OnClick()
Set objArray= CreateObject("Ihd.ihd.1")
Dim ip,port,bakip,bakport,timeout,usid,pswd,ret
ip= "127.0.0.1"
port= 5673
bakip = ""
bakport = 5673
timeout= 3
usid = "admin"
pswd = "admin"
ret = CLng(objArray.ConnectToDB(ip,port,bakip,bakport,timeout,usid,pswd))
MsgBox "连接状态:" &ret
objArray.Disconnect
Set objArray= nothing
End Sub
//SQL执行测试
Sub BSButton1_OnClick()
Set objArray= CreateObject("Ihd.ihd.1")
Dim ip,port,bakip,bakport,timeout,usid,pswd,ret
ip= "127.0.0.1"
port= 5673
bakip = ""
bakport = 5673
timeout= 3
usid = "admin"
pswd = "admin"
objArray.ConnectToDB ip,port,bakip,bakport,timeout,usid,pswd
strsql = "select * from HDArch where FTAG= 'ddd' limit 5 "
rows = 0
nRetErr = CLng(objArray.GetSQL_B(strsql,rows))
MsgBox "错误码是:" &nRetErr
MsgBox " 行数: " &rows
objArray.Disconnect
Set objArray= nothing
End Sub
//测试普通点结果集 Get_CommonTag_Rowsets
Sub BSButton1_OnClick()
Set objArray= CreateObject("Ihd.ihd.1")
Dim ip,port,bakip,bakport,timeout,usid,pswd,ret
ip= "127.0.0.1"
port= 5673
bakip = ""
bakport = 5673
timeout= 3
usid = "admin"
pswd = "admin"
objArray.ConnectToDB ip,port,bakip,bakport,timeout,usid,pswd
Dim retftag,retftime, retfquality,retfivalue, retffvalue,retfsvalue
Dim retftagtype,etftimestep,retfintertype
Dim Fields,rows,nTagName,nRetErr,strsql,shownum
strsql = "select * from HDArch where FTAG= 'ddd' limit 5 "
rows = 0
nRetErr = CLng(objArray.GetSQL(strsql,rows))
MsgBox "错误码是:" &nRetErr
MsgBox " 行数: " &rows
nRetErr = CLng(objArray.Get_CommonTag_Rowsets(retftag,rettime,retfquality,retfivalue,retffvalue,retfsalue,retftagtype,retftimestep,retintertype))
MsgBox "Get_CommonTag_Rowsets 错误码是: " &nRetErr
Dim x1,x2,showeftag
showftag = "调用后ftag: "
For x1= 0 to 2
showftag = showftag & retftag(x1) & "; "
next
MsgBox showftag
objArray.Disconnect
Set objArray= nothing
End Sub
//测试内置函数结果集
Sub BSButton1_OnClick()
Set objArray= CreateObject("Ihd.ihd.1")
Dim ip,port,bakip,bakport,timeout,usid,pswd,ret
ip= "127.0.0.1"
port= 5673
bakip = ""
bakport = 5673
timeout= 3
usid = "admin"
pswd = "admin"
objArray.ConnectToDB ip,port,bakip,bakport,timeout,usid,pswd
Dim retminfivalue,retmaxfivalue,retcountfivalue,retaveragefivalue,retsumfivalue
Dim retminffvalue,retmaxffvalue,retcountffvalue,retaverageffvalue,retsumffvalue
Dim Fields,rows,nTagName,nRetErr,strsql,shownum
strsql = "Select max(fivalue),min(fivalue), count(fivalue) from hdarch where ftag='ddd' and ftime < '2018-08-03 08:00:00.000'"
rows = 0
nRetErr = CLng(objArray.GetSQL(strsql,rows))
MsgBox "错误码是:" &nRetErr
MsgBox " 行数: " &rows
nRetErr = CLng(objArray.Get_Buildin_Func_Rowsets(retminfivalue,retmaxfivalue,retcountfivalue,retaveragefivalue,retsumfivalue,retminffvalue,retmaxffvalue,retcountffvalue,retaverageffvalue,retsumffvalue))
MsgBox " 错误码是: " &nRetErr
MsgBox "retminfivalue:" &retminfivalue
MsgBox "retmaxfivalue:" &retmaxfivalue
MsgBox "retaveragefivalue:" &retaveragefivalue
MsgBox "retcountfivalue:" &retcountfivalue
MsgBox "retsumfivalue:" &retsumfivalue
objArray.Disconnect
Set objArray= nothing
End Sub