组态王与数据库通讯
1、如何使组态王与数据库建立连接
使用组态王与数据库进行数据通讯,首先要建立它们之间的连接。下面通过一个实例介绍如何使组态王与数据库建立连接。
例如:
◆ 继续使用“定义ODBC 数据源”中的例子。在机器上D 盘根目录下建立的“SQL数据库.mdb”数据库中建立一个名为kingview 的表格。在组态王的数据词典里定义新变量,变量名称:DeviceID ,变量类型:内存整型;
◆ 然后在本机上的ODBC 数据源中建立一个数据源,比如数据源名为mine 。详细配置请参照“定义ODBC 数据源”一节;
◆ 在组态王工程浏览器中建立一个名为BIND 的记录体,定义一个字段:name (对应组态王内存字符串变量name ),详细定义请参照“记录体”一节; ◆ 连接数据库:新建画面“数据库连接”,在画面上作一个按钮,按钮文本为:“连接数据库”,在按钮“弹起时”动画连接中使用SQLConnect()函数和SQLSelect()函数建立与“mine”数据库进行连接:
SQLConnect( DeviceID, "dsn=mine;uid=;pwd=");
/*建立和数据库mine 连接,其中DeviceID 是用户创建的内存整型变量,用来保存SQLConnect()函数为每个数据库连接分配的一个数值*/
/*注意在执行SQLDisconnect (断开和数据库的连接函数)之前,重复执行SQLConnect 将会增加DeviceID ,DeviceID 最多为255*/
SQLSelect( DeviceID, "kingview", "BIND", "", "");/* SQLSelect()函数:访问一个数据库并返回一个表的信息,此信息可以被查询、删除、清空等操作*/ 以上指令执行之后,使组态王与数据库建立了连接。
2、如何创建一个表格
组态王与数据库连接成功之后,可以通过组态王操作在数据库中创建表格。下面通过一个实例介绍如何创建一个表格。
例如:
◆ 在组态王中创建一个表格模板:table1。定义三个字段:salary (整型)、name (定长字符串型,字段长度:255)、age (整型)。详细定义请参照“19.1.1 表格模板”一节;
◆ 将上节实例中画面上“连接数据库”按钮“弹起时”动画连接命令语言该为:
SQLConnect( DeviceID, "dsn=mine;uid=;pwd=");
◆ 创建数据库表格:在“数据库连接”画面上新作一个按钮,按钮文本为:“创建表格”,在按钮“弹起时”动画连接中使用SQLCreateTable()函数创建表格。 SQLCreateTable( DeviceID, "KingTable", "table1" );
/*创建数据库表格名称为:KingTable*/
该命令用于以表格模板“table1”的格式在数据库中建立名为“KingTable”的表格。在自动生成的KingTable 表格中,将生成三个字段,字段名称分别为:salary ,name ,age 。每个字段的变量类型、变量长度及索引类型与表格模板“table1”中的定义所决定。
3、如何将数据存入数据库
创建数据库表格成功之后,可以将组态王中的数据存入到数据库表格中。下面通过一个实例介绍如何将数据存入数据库。
例如:
将数据存入数据库
◆ 在组态王中创建一个记录体:BIND1。定义三个字段:salary (整型,对应组态王变量record1)、name (定长字符串型,字段长度:255,对应组态王变量name )、age (整型,对应组态王变量age )。详细定义请参照“记录体”一节; ◆ 在“数据库连接” 画面上作一个按钮,按钮文本为:“插入记录”,在按钮“弹起时”动画连接中使用SQLInsert()函数:
SQLInsert( DeviceID, "KingTable", "BIND1" );
该命令使用记录体BIND1中定义的连接在表格KingTable 中插入一个新的记录。 该命令执行后,组态王运行系统会将变量salary 的当前值插入到 Access 数据库表格“KingTable”中最后一条记录的“salary”字段中,同理变量name 、age 的当前值分别赋给最后一条记录的字段:name 、age 值。运行过程中可随时点击该按钮,执行插入操作,在数据库中生成多条新的记录,将变量的实时值进行保存。
4、如何进行数据查询
组态王在运行过程中还可以对已连接的数据库进行数据查询。下面通过一个实例介绍如何进行数据查询。
例如:
进行数据查询
◆ 在组态王中定义变量。这些变量用于返回数据库中的记录。“记录salary”:内存实型;“记录name”:内存字符串型;“记录age”:内存整型。定义记录体BIND2,用于定义查询时的连接。如图19.14所示。
图19.14 数据查询记录体
◆ 在“数据库连接” 画面上作一个按钮,按钮文本为:“得到选择集”,在按钮“弹起时”动画连接中使用SQL 连接函数,得到一个指定的选择集: SQLSelect( DeviceID, "KingTable", "BIND2" ,"","");
该命令选择表格KingTable 中所有符合条件的记录,并以记录体BIND2中定义的连接返回选择集中的第一条记录。此处没有设定条件,将返回该表格中所有记录。 执行该命令后,运行系统会把得到的选择集的第一条记录的“salary”字段的值赋给记录体BIND2中定义的与其连接的组态王变量“记录salary”,同样
“KingTable”表格中的name 、age 字段的值分别赋给组态王变量记录name 、记录age 。
◆ 画面中查询返回值的显示:在画面上做三个“##”文本,分别定义值输出连接到变量“记录salary”、“记录name”和“记录age”,如图19.15所示。
图19.15 查询返回值画面
在执行SQLSelect()函数后,首先返回选择集的第一条记录,在画面上“##”将显示返回值。
◆ 查询记录:在“数据库连接” 画面上做四个按钮。
按钮文本:第一条记录
“弹起时”动画连接:SQLFirst( DeviceID );
按钮文本:下一条记录
“弹起时”动画连接:SQLNext( DeviceID );
按钮文本:上一条记录
“弹起时”动画连接:SQLPrev( DeviceID );
按钮文本:最后一条记录
“弹起时”动画连接:SQLLast( DeviceID );
◆ 断开连接:在“数据库连接” 画面上做一个按钮,按钮文本:断开连接,“弹起时”动画连接:SQLDisconnect( DeviceID );
该命令用于断开和数据库的连接。最后的生成画面如图19.16所示:
图19.16 组态王SQL 数据库访问
定义复杂的查询
SQL 访问管理允许用户指定一个复杂的查询和设计自己的SQL 语句。这些查询可以动态的建立或由外部文件包含。另外,这些查询可能包含需要在运行时转化成查询的参数。SQL 访问管理API 允许用户执行任何一个用户的数据库支持的SQL 语句,并且返回查询结果。同时,存储过程也可有效执行。(存储过程不能被充分支持)
更详细资料,请参阅“支持存储过程”。
复杂的查询必须调用SQLSetStatement 函数
建立动态查询
为了建立动态查询,需用到两个函数:SQLSetStatement()和
SQLAppendStatement()。SQLSetStatement()开始一个新的SQL 语句。它可以是任何有效的SQL 语句,包括存储过程的名字。因为组态王只支持131个字符,SQLAppendStatement()用来附加字符串到语句中。
例如: ResultCode = SQLSetStatement ( ConnectionID, “Select LotNo, LotName, LotDescription, LotQuantity from LotInfo, ProductionInfo” ); ResultCode = SQLAppendStatement ( ConnectionID, “where LotInfo.LotNo = ProductionInfo.LotNo” );
ResultCode = SQLAppendStatement ( ConnectionID, “order by LotNo, NotName, LotQuantity” );
这时,语句就可以执行了。
注意:许多数据库列名和表名区分大小写。
从文件中读SQL 语句
用户可以在其他软件例如,Microsoft Access 和其他数据库工具建立查询,然后使用组态王的SQLLoadStatement()函数调用这一查询。
例如:
ResultCode = SQLLoadStatement ( ConnectionID,
“c:\myappdir\lotquery.sql” );
这时,语句就可以执行了。
修改扩展的SQL 语句
为了提供完全的SQL 功能,SQL Access Manager允许用户指定一个包含组态王变量的where 语句。为了允许运行时指定SQL 参数,需用到以下函数: SQLPrepareStatement(),SQLSetParamType(), QLClearStatement(),
SQLClearParam();
为了实现SQL 语句的替换,在用户想要在以后再指定的参数位置替代为一个“?”。这一语句是一个替代语句,当参数设置后,语句即可以执行。
SQLPrepareStatement()为一个执行准备一个语句。它并不执行语句,它只是激活语句使用户能设置参数。
例如:
ResultCode = SQLSetStatement ( ConnectionID, “select LotNo, LotName, LotDescription, LotQuantity from LotInfo, ProductionInfo” );
ResultCode = SQLAppendStatement ( ConnectionID, “where LotInfo.LotNo = ?”);
ResultCode = SQLAppendStatement ( ConnectionID, “order by LotNo, LotName, LotQuantit y”);
ResultCode = SQLPrepareStatement ( ConnectionID, SQLHandle ); ResultCode = SQLSetParameInt ( SQLHandle, 1, tagLotNumber );
现在,语句已经准备好,可以执行了。
一旦语句执行,并且用户不再使用准备的语句,可以调用SQLClearStatement()来释放语句相关的资源。
执行扩展的SQL 语句
根据前文可知,语句可以被动态创建或从文件中读出,可以被准备和修改。现在,可以执行语句了。SQL 访问管理器使用SQLExecute()函数来实现此功能。SQLExecute()将执行当前激活的语句或原来准备好的语句句柄。
例如1:
ResultCode = SQLLoadStatement ( ConnectionID, “c:\sql\lotquery.sql” ); ResultCode = SQLExecute ( ConnectionID, “BIND1”, 0 );
例如2:
ResultCode=SQLSetStatement( DeviceID, "select name from
kingviewT");/*SQL查询语句:从表格kingviewT 选取name 列*/
ResultCode=SQLAppendStatement( DeviceID, "where salary = ?");/*使用?以后赋值*/
ResultCode=SQLPrepareStatement( DeviceID, handle);/*准备语句*/
ResultCode=SQLSetParamInt(handle,1, value );/*为?设置参数value 为内存整数*/
ResultCode=SQLExecute( DeviceID, "BIND1" , handle );/*执行*/
例如3:
SQLSetStatement( ConnectID, “select agg from kingviewT” ); SQLExecute( ConnectID, 0 );
例3中,SQLExecute()函数中句柄设置为零,语句没有必要用SQLPrepare()来准备。
支持存储的过程
SQLExecute 函数支持存储过程的执行。假设用户在数据库服务器上建立了一个名为“LotInfoProc”的过程,此过程包含语句:“Select LotNo,LotName from LotInfo”。用户可以在组态王命令语言中写入以下指令实现:
当使用微软SQL Server:
ResultCode = SQLSetStatement ( ConnectionID, “LotInfoProc” ); R esultCode = SQLExecute( ConnectionID, “BIND1”, 0 );
当使用Oracle 或Microsoft Access:
ResultCode = SQLSetStatement ( ConnectionID, “{CALL LotInfoProc}” ); ResultCode = SQLExecute( ConnectionID, “BIND1”, 0 );