第19章 组态王数据库访问(SQL) 下载本文

第十九章 组态王数据库访问(SQL) 843 第十九章 组态王数据库访问(SQL)

? 介绍组态王SQL访问功能 ? 组态王如何与通用数据库连接

组态王SQL访问功能是为了实现组态王和其他ODBC数据库之间的数据传输。它包括组态王SQL访问管理器、如何配置与各种数据库的连接、组态王与数据库连接实例和SQL函数的使用。

组态王SQL访问管理器用来建立数据库列和组态王变量之间的联系。通过表格模板在数据库中创建表格,表格模板信息存储在SQL.DEF文件中;通过记录体建立数据库表格列和组态王之间的联系,允许组态王通过记录体直接操纵数据库中的数据。这种联系存储在BIND.DEF文件中。

组态王可以与其他外部数据库(支持ODBC访问接口)进行数据传输。首先在系统ODBC数据源中添加数据库,然后通过组态王SQL访问管理器和SQL函数实现各种操作。

组态王SQL函数可以在组态王的任意一种命令语言中调用。这些函数用来创建表格,插入、删除记录,编辑已有的表格,清空、删除表格,查询记录等操作。

19.1 组态王SQL访问管理器

组态王SQL访问管理器包括表格模板和记录体两部分功能。当组态王执行SQLCreateTable();指令时,使用的表格模板将定义创建的表格的结构;当执行SQLInsert();、SQLSelect();或SQLUpdate();时,记录体中定义的连接将使组

北京亚控科技发展有限公司

844 第十九章 组态王数据库访问(SQL) 态王中的变量和数据库表格中的变量相关联。

组态王SQL访问管理器 表格模板 Table1 列名 salary name age 数据类型 整型 定长字符串 浮点型 长度 10 255 1 记录体BIND2 列名 Salary Name Age 组态王变量 record1 name age SQLInsert 数据库表格 name emploee1 emploee2 emploee3

age 24 25 26

SQLCreateTable 新表格 salary name age salary

100 200 300

组态王提供集成的SQL访问管理。在组态王工程浏览器的左侧大纲项中,可以看到SQL访问管理器。如图19.1所示。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 845

图19.1 组态王SQL访问管理器 19.1.1 表格模板

选择工程浏览器左侧大纲项“SQL访问管理器文件\\表格模板”,在工程浏览器右侧用鼠标左键双击“新建”图标,弹出对话框如图19.2所示。该对话框用于建立新的表格模板。

北京亚控科技发展有限公司

846 第十九章 组态王数据库访问(SQL)

图19.2 创建表格模板

模板名称:表格模板的名称,长度不超过32个字节;

字段名称:使用表格模板创建数据库表格中字段的名称,长度不超过32个字节;

变量类型: 表格模板创建数据库表格中字段的类型。点击下拉列表框按钮,其中有四种类型供选择,整型、浮点型、定长字符串型、变长字符串型;

字段长度:当变量类型中选择“定长字符串型”或“变长字符串型”时,该项文本框由“灰色”(无效)变为“黑色”(有效)。在文本框中输入字段长度数值,该数值必须为正整数,且不大于255个字节;

索引类型:点击下拉列表框按钮,其中有三种类型供选择,有(唯一)、有(不唯一)、没有。索引功能是数据库用于加速字段中搜索及排序的速度,但可能会使更新变慢。选择“是(唯一)”可以禁止该字段中出现重复值;

允许为空值:选中该项,将在前面的方框中出现“?”标志,表示数据记录到数据库的表格中该字段可以有空值。不选中该项则表示该字段的数据不能为空值;

增加字段:在上面定义字段中各个项定义好后,点击“增加字段”按钮,将会把定义好的字段增加到显示框中;

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 847 删除字段:从显示框中选中已有字段的字段名称,点击“删除字段”按钮,将会把定义好的字段从显示框中删除;

修改字段:从显示框中选中已有字段的字段名称,此时该字段各项属性显示在定义字段各项中,对各个属性进行修改,然后点击“修改字段”按钮,将会把修改后的的字段重新显示在显示框中,修改完字段后,必须点击“确认”按钮才会保存修改内容;

上移一行:从显示框中选中已有字段的字段名称,点击“上移一行”按钮,将会把选中的字段向上移动一行,在数据库创建表格中将改变该字段位置;

下移一行:从显示框中选中已有字段的字段名称,点击“下移一行”按钮,将会把选中的字段向下移动一行,在数据库创建表格中将改变该字段位置。

? 例:创建一个表格模板 创建一个表格模板:table1; 定义三个字段:salary(整型)、name(定长字符串型,字段长度:255)、age(整型)。如图19.3所示。

图19.3定义表格模板table1

北京亚控科技发展有限公司

848 第十九章 组态王数据库访问(SQL) 19.1.2 记录体

记录体用来连接表格的列和组态王数据词典中的变量。选择工程浏览器左侧大纲项“SQL访问管理器文件\\记录体”,在工程浏览器右侧用鼠标左键双击“新建”图标,弹出对话框如图19.4所示。该对话框用于建立新的记录体。

图19.4 创建记录体

记录体名:记录体的名称,长度不超过32个字节;

字段名称:数据库表格中的列名,长度不超过32个字节; 组态王变量:与数据库表格中指定列相关联的组态王变量名称。点击右边“?”按钮,弹出“选择变量名”窗口,可以从中选择组态王变量;

增加字段:在上面定义完字段名称和组态王变量后,点击“增加字段”按钮,将会把定义好的字段增加到显示框中;

删除字段:从显示框中选中已有字段的字段名称,点击“删除字段”按钮,将会把定义好的字段从显示框中删除;

修改字段:从显示框中选中已有字段的字段名称,此时该字段名称和对应组态王变量名称会显示在各项中,对各项进行修改,然后点击“修改字段”按钮,

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 849 将会把修改后的的字段重新显示在显示框中,修改完字段后,必须点击“确认”按钮才会保存修改内容;

上移一行:从显示框中选中已有字段的字段名称,点击“上移一行”按钮,将会把选中的字段向上移动一行;

下移一行:从显示框中选中已有字段的字段名称,点击“下移一行”按钮,将会把选中的字段向下移动一行。

? 例:创建一个记录体 定义三个组态王变量,分别为:record1(内存实型)、name(内存字符串型)、age(内存整型);

创建一个记录体:BIND1;

定义三个字段:salary(对应组态王变量record1)、name(对应组态王变量name)、age(对应组态王变量age)。如图19.5所示。

图19.5 创建记录体BIND1 北京亚控科技发展有限公司

850 第十九章 组态王数据库访问(SQL)

? 注意: 保持记录体中字段的顺序和数据库中表格的顺序一致; 表格模板最大数目:1024; 表格模板中字段最大数目:1024; 记录体最大数目:1024; 记录体中字段最大数目:1024。

19.2 如何配置与数据库的连接

19.2.1 定义ODBC数据源

组态王SQL访问功能能够和其他外部数据库(支持ODBC访问接口)之间的数据传输。实现数据传输必须在系统ODBC数据源中定义相应数据库。

进入“控制面板”中的“管理工具”,用鼠标双击“数据源 (ODBC)”选项,弹出“ODBC数据源管理器”对话框,如图19.6所示。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 851

图19.6 ODBC数据源管理器

有些计算机的ODBC数据源是中文的(如上图所示),有些的是英文的,视机器而定,但是两种的使用方法相同。

“ODBC数据源管理器”对话框中前两个属性页分别是“用户DSN”和“系统DSN”,二者共同点是:在它们中定义的数据源都存储了如何与指定数据提供者在连接的信息,但二者又有所区别。在“用户DSN”中定义的数据源只对当前用户可见,而且只能用于当前机器上;在“系统DSN”中定义的数据源对当前机器上所有用户可见,包括NT服务。因此用户根据数据库使用的范围进行ODBC数据源的建立。

? 例:以Microsoft Access数据库为例,建立ODBC数据源。

◆ 在机器上D盘根目录下建立一个Microsoft Access数据库,名称为:SQL数据库.mdb;

◆ 双击“数据源 (ODBC)”选项,弹出“ODBC数据源管理器”对话框,点击“系统DSN”属性页,如图19.7所示;

◆ 单击右边“增加”按钮,弹出“创建新数据源”窗口,从列表中选择

北京亚控科技发展有限公司

852 第十九章 组态王数据库访问(SQL) “Microsoft Access Driver(*.mdb)”驱动程序,如图19.8所示;

◆ 单击“完成”按钮,进入“ODBC Microsoft Access安装”对话框,如图19.9所示;

图19.7 “系统DSN”属性页

图19.8 创建新数据源

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 853

图19.9 “ODBC Microsoft Access安装”对话框

◆ 在“数据源名”中输入数据源名称:mine;单击“选择”按钮,从计算机上选择数据库,选择好数据库后的对话框如图19.10所示;

图19.10 “ODBC Microsoft Access安装”对话框完成

◆ 点击“确定”按钮,完成数据源定义,回到“ODBC数据源管理器”窗口,点击“确定”关闭“ODBC数据源管理器”窗口。

北京亚控科技发展有限公司

854 第十九章 组态王数据库访问(SQL) 完成Microsoft Access数据库ODBC数据源的定义。其它类型的数据库定义方法类似。

19.2.2 组态王支持的数据库及配置

19.2.2.1 Oracle6数据库

为了和Oracle6通讯需要进行如下设置: ◆ 配置你的Windows数据库客户;

◆ 启动SQL*Net TSR和NETINIT.EXE程序;

◆ 通过在组态王命令语言中执行SQLConnect()函数建立和Oracle的连

接。

启动SQL*Net TSR和NETINIT.EXE Oracle 数据库可以通过在本地机上安装Oracle’s SQL*Net 来访问。Oracle’s SQL Net包括SQL*Net TSR和NETINIT.EXE程序。为了和Oracle数据库连接,这两个程序都要运行。SQL*Net TSR必须在运行Windows之前在DOS环境中运行。NETINIT.EXE在Windows中运行。

SQLConnect()格式

本函数用来和Oracle数据库连接。格式如下:

SQLConnect(ConnectionID,“=;=; …”);

下面介绍Oracle中使用的属性:

属性 DSN UID PWD SRVR

? 例:

SQLConnect(ConnectionID,“DSN=Oracle_Data;UID=asia;PWD=abcd;SRVR=B:MKTG_SRV”);

值 微软ODBC管理器配置的数据源名字 用户名 密码 指明服务器和数据库 北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 855

? 注意: SRVR比较难于设置。根据SQL*Net驱动不同,设置值将不同。这一信息可以在SQL*Net文档中得到(或可能在CONFIG.ORA文件的“remote=”行中得到)。

支持的数据类型

对于Oracle6支持两种数据。char类型对应着组态王中的字符串变量,缺省长度为1。Oracle6最多支持255个字符。number类型对应着组态王中的整数和实数变量。

19.2.2.2 Oracle7.2数据库

为了和Oracle通讯需要进行如下设置:

◆ 在组态王本机上安装Oracle Standard Client; ◆ 运行SQL_Net Easy 配置为SQL连接分配字符串; ◆ 创建一个数据源名;

◆ 使用SQLConnect()连接。 配置SQL_Net

1.启动Oracle的SQL_Net Easy Configuration;

2.缺省下,服务器的化名将以wgs_ServerName_orcl开始。数据库的化名在组态王SQLConnect()函数中使用; 3.修改化名,单击OK;

4.单击Modify Database Alias Select Network protocol。命名管道是Oracle服务器的计算机名。 配置数据源名

1.启动控制面板中的ODBC。单击“System DSN”属性页。单击“Add”按钮。弹出“Create New Data Source”对话框;

2.选择Oracle7 ODBC驱动,然后单击Finish。ODBC Oracle Driver Setup将会弹出。在Data Source Name框中,键入你的Oracle服务器名; 3.单击Advanced。使用ODBC Oracle Advanced Driver Setup 对话框。单

北京亚控科技发展有限公司

856 第十九章 组态王数据库访问(SQL) 击Close。ODBC Data Source Administrator 对话框将再次出现,如图19.11所示; 4.单击确定完成。

图19.11 定义Oracle7.2数据源

为Oracle数据域登录日期和时间

为了登录日期和时间,你必须配置记录体(捆绑表)。

1.在组态王工程浏览器中,单击SQL访问管理器中的记录体,将弹出创建记录体对话框;

2.在字段名称栏中,输入DATE_TIME delim()函数;

3.在组态王变量栏中,输入你想要捆绑的变量,如图19.12所示;

4.在组态王命令语言中,给DATE_TIME_TAG变量赋当前的日期和时间值。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 857

图19.12 配置记录体

19.2.2.3 SyBase或MS SQLServer数据库

为了和SyBase或Microsoft SQL Server通讯需要进行如下设置: ◆ 配置Windows的数据库用户; ◆ 使用SQLConnect()函数连接。

配置数据库

1.打开Windows控制面板的32位ODBC数据源管理器。单击添加,选择SQL

Server,弹出ODBC SQL Server配置画面: 2.在Data Source Name栏填写数据源名称。在Server栏填写数据库Server名称。在网络地址中,填写SQL Server的访问地址。单击Option>>,在数据库名栏填写数据库名称,如图19.13所示。

注意:SQL Server名称必须和网络上SQL Server的名称一致。具体名称通过SQL Server管理程序“SQL Enterprise Manager”确认。

北京亚控科技发展有限公司

858 第十九章 组态王数据库访问(SQL)

图19.13 配置SQL Server数据库

连接格式

SQLConnect(ConnectionID,”=;=;…”);

SyBase和SQL Server用到的属性如下: 属性 DSN UID PWD SRVR DATABASE 值 ODBC中定义的数据源名 登录ID号 密码,区分大小写 数据库所在的计算机名 所要访问的数据库名

? 例如:

SQLConnect(ConnectionID,“DSN=wang; DATABASE=kingivew;UID=user1; PWD= abcd”);

支持的数据类型

支持三种数据类型。char类型包含定长的字符串。组态王对应变量需要是字符串。必须指定长度。SyBase和SQL Server支持最长255个字符。int类型对应组态王的整数变量。如果变量长度没有确定,长度将被设置成数据库默认值。float类型对应组态王的实型变量。无需为这种变量设定长度。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 859 ? 注意: 当使用Sybase Database Server, 数据类型(char,int,float)区分大小写,并且必须小写。 Sybase或Microsoft SQL Server在同一时刻只能支持一个激活的语句。列名和表名也区分大小写。表名必须由表的拥有者充分授权。例如:dbo.MyTable。 19.2.2.4 dBase数据库

为了和dBASE连接,必须执行SQLConnect()函数。 SQLConnect()格式 SQLConnect(ConnectionID,“=; =;…”);

下面描述dBASE的属性。请注意遵守列出顺序。

属性 DSN CS DB FOC LCK CSZ 值 微软Microsoft ODBC 配置的数据源名 决定数据存储格式是以IBM PC 符号还是以ANSI符号。缺省设置是IBMPC 指定dBASE存储的路径,缺省为当前路径 已打开未使用的文件的最大数 决定数据库文件记录访问等级。有效值为FILE,RECORD,(缺省),NONE 用来缓存数据库记录的64K模块的个数。此值越大,性能越好。缺省为4。能够设定的最大值取决于有效的系统内存。 决定驱动器何时更新数据库。当此值为1时,驱动器在每次COMMIT时都更新数据库。这将降低系统性能;缺省为0,这意味着驱动器在文件关闭时更新数据库。但如果机器在北京亚控科技发展有限公司

USF 860 第十九章 组态王数据库访问(SQL) 文件关闭之前崩溃将使新增加的的记录丢失 MS LCOMP COMP 本选项决定是否支持先前的Q+E软件。MS=0时支持。缺省为1 决定选用dBASE兼容的锁定还是Q+E兼容的锁定方式 提供对Q+E软件的向前兼容。COMP=DBASE则向前兼容;COMP=ANSI则是简装型

支持的数据类型

SQL管理器支持dBASE的三种数据类型。char类型包含定长的字符串,对应组态王中的字符串变量。数据库dBASE最大支持254个字符。numeric类型和float类型对应组态王中整型或实型变量。必须设定变量长度。格式为十进制宽度。

19.2.2.5 MS Access数据库

为了和Microsoft Access连接,必须执行SQLConnect()函数。 SQLConnect()格式

SQLConnect(ConnectionID,“=;=;…” );

以下介绍Access用到的属性。 属性 值 DSN ODBC中设置的数据源名称

支持的数据类型

SQL访问管理器支持Access数据库的五种数据类型。有效的数据类型种类由你所使用的ODBC的版本所决定。类型text包括定长字符串和组态王中的字符串变量相对应,必须设定参数。Access数据库最多支持255个字符。

19.3 组态王SQL使用简介

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 861 19.3.1 如何使组态王与数据库建立连接

使用组态王与数据库进行数据通讯,首先要建立它们之间的连接。下面通过一个实例介绍如何使组态王与数据库建立连接。

? 例:组态王与Microsoft Access数据库建立连接

◆ 继续使用“19.2.1 定义ODBC数据源”中的例子。在机器上D盘根目录下建立的“SQL数据库.mdb”数据库中建立一个名为kingview的表格。在组态王的数据词典里定义新变量,变量名称:DeviceID,变量类型:内存整型;

◆ 然后在本机上的ODBC数据源中建立一个数据源,比如数据源名为mine。详细配置请参照“19.2.1 定义ODBC数据源”一节;

◆ 在组态王工程浏览器中建立一个名为BIND的记录体,定义一个字段:name(对应组态王内存字符串变量name),详细定义请参照“19.1.2记录体”一节;

◆ 连接数据库:新建画面“数据库连接”,在画面上作一个按钮,按钮文本为:“连接数据库”,在按钮“弹起时”动画连接中使用SQLConnect()函数和SQLSelect()函数建立与“mine”数据库进行连接:

SQLConnect( DeviceID, \

/*建立和数据库mine连接,其中DeviceID是用户创建的内存整型变量,用来保存SQLConnect()函数为每个数据库连接分配的一个数值*/

/*注意在执行SQLDisconnect(断开和数据库的连接函数)之前,重复执行SQLConnect将会增加DeviceID,DeviceID最多为255*/

SQLSelect( DeviceID, \

/* SQLSelect()函数:访问一个数据库并返回一个表的信息,此信息可以被查询、删除、清空等操作*/

以上指令执行之后,使组态王与数据库建立了连接。

19.3.2 如何创建一个表格

组态王与数据库连接成功之后,可以通过组态王操作在数据库中创建表格。

北京亚控科技发展有限公司

862 第十九章 组态王数据库访问(SQL) 下面通过一个实例介绍如何创建一个表格。

? 例:创建数据库表格

◆ 在组态王中创建一个表格模板:table1。定义三个字段:salary(整型)、name(定长字符串型,字段长度:255)、age(整型)。详细定义请参照“19.1.1 表格模板”一节;

◆ 将上节实例中画面上“连接数据库”按钮“弹起时”动画连接命令语言该为:

SQLConnect( DeviceID, \◆ 创建数据库表格:在“数据库连接”画面上新作一个按钮,按钮文本为:“创建表格”,在按钮“弹起时”动画连接中使用SQLCreateTable()函数创建表格。

SQLCreateTable( DeviceID, \/*创建数据库表格名称为:KingTable*/ 该命令用于以表格模板“table1”的格式在数据库中建立名为“KingTable”的表格。在自动生成的KingTable表格中,将生成三个字段,字段名称分别为:salary,name,age。每个字段的变量类型、变量长度及索引类型与表格模板“table1”中的定义所决定。

19.3.3 如何将数据存入数据库

创建数据库表格成功之后,可以将组态王中的数据存入到数据库表格中。下面通过一个实例介绍如何将数据存入数据库。

? 例:将数据存入数据库

◆ 在组态王中创建一个记录体:BIND1。定义三个字段:salary(整型,对应组态王变量record1)、name(定长字符串型,字段长度:255,对应组态王变量name)、age(整型,对应组态王变量age)。详细定义请参照“19.1.2 记录体”一节;

◆ 在“数据库连接” 画面上作一个按钮,按钮文本为:“插入记录”,在按钮“弹起时”动画连接中使用SQLInsert()函数:

SQLInsert( DeviceID, \ );

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 863 该命令使用记录体BIND1中定义的连接在表格KingTable中插入一个新的记录。

该命令执行后,组态王运行系统会将变量salary的当前值插入到 Access数据库表格“KingTable”中最后一条记录的“salary”字段中,同理变量name、age的当前值分别赋给最后一条记录的字段:name、age值。运行过程中可随时点击该按钮,执行插入操作,在数据库中生成多条新的记录,将变量的实时值进行保存。

19.3.4 如何进行数据查询

组态王在运行过程中还可以对已连接的数据库进行数据查询。下面通过一个实例介绍如何进行数据查询。

? 例:进行数据查询

◆ 在组态王中定义变量。这些变量用于返回数据库中的记录。“记录salary”:内存实型;“记录name”:内存字符串型;“记录age”:内存整型。定义记录体BIND2,用于定义查询时的连接。如图19.14所示;

北京亚控科技发展有限公司

864 第十九章 组态王数据库访问(SQL)

图19.14 数据查询记录体

◆ 在“数据库连接” 画面上作一个按钮,按钮文本为:“得到选择集”,在按钮“弹起时”动画连接中使用SQL连接函数,得到一个指定的选择集:

SQLSelect( DeviceID, \该命令选择表格KingTable中所有符合条件的记录,并以记录体BIND2中定义的连接返回选择集中的第一条记录。此处没有设定条件,将返回该表格中所有记录。

执行该命令后,运行系统会把得到的选择集的第一条记录的“salary”字段的值赋给记录体BIND2中定义的与其连接的组态王变量“记录salary”,同样“KingTable”表格中的name、age字段的值分别赋给组态王变量记录name、记录age。

◆ 画面中查询返回值的显示:在画面上做三个“##”文本,分别定义值输出连接到变量“记录salary”、“记录name”和“记录age”,如图19.15所示。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 865

图19.15 查询返回值画面

在执行SQLSelect()函数后,首先返回选择集的第一条记录,在画面上“##”将显示返回值。

◆ 查询记录:在“数据库连接” 画面上做四个按钮。

按钮文本:第一条记录

“弹起时”动画连接:SQLFirst( DeviceID ); 按钮文本:下一条记录

“弹起时”动画连接:SQLNext( DeviceID ); 按钮文本:上一条记录

“弹起时”动画连接:SQLPrev( DeviceID ); 按钮文本:最后一条记录

“弹起时”动画连接:SQLLast( DeviceID );

◆ 断开连接:在“数据库连接” 画面上做一个按钮,按钮文本:断开连接,“弹起时”动画连接:SQLDisconnect( DeviceID );

该命令用于断开和数据库的连接。 最后的生成画面如图19.16所示:

北京亚控科技发展有限公司

866 第十九章 组态王数据库访问(SQL)

图19.16 组态王SQL数据库访问

定义复杂的查询

SQL访问管理允许用户指定一个复杂的查询和设计自己的SQL语句。这些查询可以动态的建立或由外部文件包含。另外,这些查询可能包含需要在运行时转化成查询的参数。SQL访问管理API允许用户执行任何一个用户的数据库支持的SQL语句,并且返回查询结果。同时,存储过程也可有效执行。(存储过程不能被充分支持)

更详细资料,请参阅“支持存储过程”。

复杂的查询必须调用SQLSetStatement 函数。

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 867 建立动态查询

为了建立动态查询,需用到两个函数: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();

北京亚控科技发展有限公司

868 第十九章 组态王数据库访问(SQL) 为了实现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, LotQuantity”);

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, \name from

北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 869 kingviewT\

/*SQL查询语句:从表格kingviewT选取name列*/

ResultCode=SQLAppendStatement( DeviceID, \/*使用?以后赋值*/

ResultCode=SQLPrepareStatement( DeviceID, handle); /*准备语句*/

ResultCode=SQLSetParamInt(handle,1, value ); /*为?设置参数value为内存整数*/

ResultCode=SQLExecute( DeviceID, \/*执行*/

? 例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” ); ResultCode = SQLExecute( ConnectionID, “BIND1”, 0 ); 当使用Oracle或Microsoft Access:

ResultCode = SQLSetStatement ( ConnectionID, “{CALL LotInfoProc}” ); ResultCode = SQLExecute( ConnectionID, “BIND1”, 0 );

19.3.5 SQL函数及SQL函数的参数

北京亚控科技发展有限公司

870 第十九章 组态王数据库访问(SQL) 组态王使用SQL函数和数据库交换信息。这些函数是组态王标准函数的扩充,可以在组态王的任意一种命令语言中使用。这些函数允许你选择,修改,插入,或删除数据库表中的记录。 SQL函数

以下列出所有的SQL函数。值得注意的是SQL查询功能是同步的,在SQL查询功能结束之前,控制权不能返回组态王。(包括趋势曲线等将被挂起)

所有的SQL函数(除SQLNumRows()之外)都会返回一个结果代码。如果这个代码不为零,表明调用函数失败。结果代码可以通过SQLErrorMsg()函数得到。

SQL函数的通常格式如下:

SQLFunction(Parameter1,Parameter2,?)

需要更详细的资料,请参考“第十章 创建命令语言程序”。

函数 功能 SQLAppendStateme使用SQLStatement的内容继续一个SQL语句 nt SQLClearParam 清除特定参数的值 SQLClearStatemen释放和SQLHandle指定的语句相关的资源 t SQLClearTable 删除表格中的记录,但保留表格 SQLCommit 定义一组transaction命令的结尾 SQLConnect 连接组态王到connectstring指定的数据库中 SQLCreatTable 使用表格模板中的参数在数据库中 SQLDelete 删除一个或多个记录 SQLDisconnect 断开和数据库的连接 SQLDropTable 破坏一个表格 SQLEndSelect 在SQLSelect()后使用本函数来释放资源 SQLErrorMsg 返回一个文本错误信息,此错误信息和特定的结果代码相关 SQLExecute 执行一个SQL语句。如果这个语句是一个选择语句,捆绑表中的参数所指定的名字用来捆绑数据词典中变量和数据库的列 SQLFirst 选择由SQLSelect()选择的表格中的首项记录 北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 871 SQLGetRecord SQLInsert SQLInsertEnd SQLInsertExecute SQLInsertPrepare SQLLast SQLLoadStatement SQLManagerDSN SQLNext SQLNumRows SQLPrepareStatement SQLPrev SQLRollback SQLSelect SQLSetParamChar SQLSetParamDate SQLSetParamDateTime SQLSetParamDecimal 从当前选择缓存区返回由RecordNumber指定的记录 使用捆绑表中指定的变量中的值在表格中插入一个新记录。捆绑表中的参数定义了组态王中变量和数据库表格列的对应关系 释放插入语句 执行已经准备的语句 准备一个插入语句 选择SQLSelect()指定表格中的末项 读包含在FileName中的语句,它类似与SQLSetStatement()创建的语句,能被SQLAppendStatement()挂起,或由SQLExecute()执行,每个文件中只能包含一个语句 运行微软ODBC管理器设置程序。可以用来增加,删除和修改所有的数据源名字 选择表中的下一条记录 指出有多少条记录符合上一次SQLSeclect()的指定 本语句为SQLSetParam()准备一个SQL语句。一个语句可以由SQLSetStatement(),或SQLLoadStatement()创建 选择表中的上一条记录 访问一个数据库并返回一个表的信息,此信息可以被SQLFirst(),SQLLast(),SQLNext()和SQLPrev() 将指定的参数设成特定的字符串。本函数可以调用多次,以设置参数值 将指定的日期参数设置成特定的字符串 将指定的日期时间参数设置成特定的字符串 将指定的十进制参数设置成特定的字符串 北京亚控科技发展有限公司

872 第十九章 组态王数据库访问(SQL) SQLSetParamFloat SQLSetParamInt SQLSetParamLong SQLSetParamNull SQLSetParamTime SQLSetStatement SQLTransact SQLUpdate SQLUpdateCurrent

将指定的参数设置成特定的值 将指定的参数设置成特定的值 将指定的参数设置成特定的值 将指定的参数设置成空值 将指定的时间参数设置成特定的字符串 启动一个语句缓存区,此语句缓存区由SQLStatement()使用 定义了一组访问指令的开始。在SQLTransact()指令和 SQLCommit()指令之间的一组指令称为一个访问组。一个访问组可以象单个访问一样操作。在SQLTransact()指令执行后,所有接下的操作都不委托给数据库,直到SQLCommit()指令执行 用当前的组态王变量更新数据库中的记录 更新数据库中的记录 函数的参数

下面将介绍SQL函数用到的参数。在命令语言中,当一个参数用引号括起,参数是一个额外的字符串,如果没有引号,参数将认为是组态王的一个变量。大部分SQL函数调用以下参数的一个或多个:

BindList ConnectionID SQL.DEF文件中定义的捆绑列表名 用户创建的内存整形变量,用来保存SQLConnect()函数为每个数据库连接分配的一个数值 指示数据库以及任何附加登录信息的字符串 出错信息,更详细的解释,请参考第4节 包含信息的文件名 列的最大容量。这一设定决定参数是字符串型还是长字符串型。如果MaxLen小于数据库允许的最大长度,参数是字符串型,否则是长字符串型 定义排序的列和方向。只有列可以进行排序。格式:ColumnName[ASC|DESC]。例:为名为manager北京亚控科技发展有限公司

ConnectString ErrorMsg FileName MaxLen OrderByExpression 第十九章 组态王数据库访问(SQL) 873 的列进行升排序,“manager ASC”。为多列排序,格式:ColumnName[ASC|DESC], ColumnName[ASC| DESC] ParameterNumber 语句中实际的参数个数 ParameterValue 设定的实际值 Precision 十进制值的精度,字符串的最大长度,日期时间的字节长度 RecordNumber 返回的实际记录个数 ResultCode 大部分SQL函数返回一个整数。如果函数成功,返回0,如果失败,返回一个负值 Scale 十进制数的量程。本参数仅在参数设置为空时有用 SQLHandle 当使用高级函数时,SQL返回SQLHandle,供内部使用 SQLStatement 实际语句 TableName 数据库中表名 TemplateName 表格模板名 WhereExpression 定义一个条件,此条件对表格中所有的行或为真,或为假。命令只对条件为真的行起作用。格式: ColumnName comparison_operator expression 注意:如果列为字符串类型,表达式必须带单引号。 下例将选择所有name列为kingview的行: name=’kingview’ 下例选择agg列界于20到30之间的行: agg>=20 and agg<30 19.3.6 如何得到SQL错误信息

本节介绍如何使用SQL函数返回的结果代码分析出错信息。 错误分析函数

所有的SQL函数返回一个结果代码。SQLErrorMsg()函数能返回结果代码的错误信息。

北京亚控科技发展有限公司

874 第十九章 组态王数据库访问(SQL)

? 例:

SQLErrorMsg( ResultCode,buf );

这里:ResultCode是前一个SQL函数得到的整数。

Buf为与该错误码相对应的文本解释,为一字符串变量。

结果代码错误信息

SQLErrorMsg()函数将设定组态王字符串变量Buf。以下是SQL函数可能出现的结果代码和它们的相应的信息描述: 结果代码 错误信息 0 -5 -7 没有发现错误 没有更多的行 数据库连接失败 无效的数据库设备 无效的选择集 无效的记录体 无效的表格模板 无效的句柄 内存溢出 无效的连接 描述 指令执行成功 已经到了表格中的最后一条记录 -9 -10 -12 -13 -14 -1001 -1002 执行本函数内存已经不足 传递给函数的ConnectionID无效 北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 875 -1003 没有发现捆绑列表 没有发现表格模板 内部错误 字符串为空 指定的捆绑列表名不存在 -1004 -1005 -1006 -1007 -1008 -1009 指定的表格模板名不存在 请求技术支持 警告:从数据库中读入的字符串为空 字符串is 警告:读入的字符串超过131个字符and is truncated truncated on a select 没有where语句 删除时没有where语句 建立连接失败 连接指令中“DB=”指定的数据库不存在 -1010 -1011 没有选定行 SQLNumRows(),SQLFirst(),SQLNext(),或SQLPrev()指令在执行SQLSelect()指令之前被调用 列的类型可能设置不正确。例如:对于一个dBASE文件,如果一个表格模板的列项是character而不是char,就会出错。 -4149

你提供连接,语句,或查询句柄无效 特定数据库的错误信息: 1.Oracle 错误信息 解决方法 北京亚控科技发展有限公司

876 第十九章 组态王数据库访问(SQL) 如果你没有运行NETINIT.EXE,把它放到Windows 的启动组中。如果你正运行NETINIT.EXE并想要建立多个连接,你需要分ORA-03112-Host String 配内存。通过在CONFIG.ORG文件中设定Syntax error WIN_REMOTE_SESSIONS参数可以实现。例如要为四个连接分配内存: WIN_REMOTE_SESSIONS=4 ORA-3121-No interface 在进入Windows之前启动SQL*NET TSR driver connected ORA-6435-NetBIOS:Unable to add local name to name 必须运行网络软件(Novell,LAN Manager,等.) table ORA-09301-Local kernel only supported in 在连接字符串中定义服务器名(“SRVR= ”) standard name table ORA-06430-Unable to make 检查连接字符串中属性是否正确 connection

2.Sybase or Microsoft SQL Sever 出错信息 解决方法 You can not have more than one 使用SQLEnd()释放系统资源,或对第二个statement active at a time 语句使用不同的ConnectionID There is not enough memory available to process the 尝试重起客户机 command 北京亚控科技发展有限公司

第十九章 组态王数据库访问(SQL) 877 Invalid object name table 你使用的数据库中不存在此表格名 name

3.DBASE 出错信息 File or DLL not found 解决方法 对Windows来说,QEDBF.DLL必须在当前目录或\\windows\\system\\目录下。 确认在你的目录下已经有DLLS。为了DBF支持,你需要QLDBF.DLL Invalid connection The connection or statement handel you provided is not 组态王语句中可能出现索引错误 valid 19.3.7 如何将数据库里的数据读到组态王中来

使用组态王数据库访问功能,除了可以直观的将数据显示在画面中外,还可以将数据库中的数据显示到趋势曲线上和数据表格中。

组态王提供一个历史趋势曲线控件将数据库中的数据以趋势曲线的形式显示出来。具体操作请参见“8.3.3 历史趋势曲线控件”一节。

组态王还提供一个访问开放型数据库显示控件将数据库中的数据以列表的形式显示出来。具体操作请参见“14.3.4 开放型数据库显示控件”一节。

北京亚控科技发展有限公司