2023年11月23日发(作者:)

组态王对关系数据库的查询

例程说明文档

“组态王对关系数据库的查询”例程说明文档

1. 功能概述 ................................................................................................................ 1

2. 工程实例 ................................................................................................................ 1

3. 操作步骤 ................................................................................................................ 1

3.1 数据库以及表 .............................................................................................. 1

3.2 设置ODBC数据源 ....................................................................................... 2

3.3 利用SQL函数进行查询 .............................................................................. 5

3.4 利用KVADODBGrid控件进行查询 ......................................................... 11

4. 注意事项 .............................................................................................................. 22

“组态王对关系数据库的查询”例程说明文档

1. 功能概述

常规需求:很多工业现场要求对关系数据库的数据根据不同的条件进行查询处理。

组态王中的实现方法:

1)利用组态王的SQL函数实现对数据库的数据的查询处理。

2)利用组态王的KVADODBGrid控件实现对数据库的查询处理。

这两种实现方法的不同之处在于:第一种方式是将查询结果对应到组态王的变量上,

可以通过组态王的变量进行相关的计算处理以及在命令语言中使用,但是如果符合条件

的记录有许多条则无法同时看到所有的查询选择结果。第二种方式是将查询结果显示到

控件的表格中,可以看到所有符合条件的查询记录,并且可以另存为其他文件以及进行

打印操作,还可以通过控件的属性、方法进行其他的处理。

2. 工程实例

我们以上一个例程“组态王数据存储到外部数据库”中所存储的数据为例,上一个

例程中我们把原料的生产厂家、原料编号、称量日期、称量时间,值班人员、原料重量

的信息存到了Access数据库中,现在我们要求对存储的原料信息按照“称量日期”进行

查询。我们假设的前提是这个Access数据库已经存在,并且已经存数据在数据库中。具

体的存储数据到外部Access数据库的过程我们可以参考其他文档来实现。下面就以此为

例来演示完成这一需求的具体步骤。

3. 操作步骤

3.1 数据库以及表

1)假设在工程文件夹中已经存在Access数据库,数据库为“数据.mdb”。

2)在数据库“数据.mdb”中有一个数据表:表的名称为:原料数据。字段为:称

量日期、称量时间、原料重量、原料厂家、原料编号、值班人员。如下图一所示:原料

重量为数字类型(单精度),其余为文本类型。

3)在数据库的原料数据表中已经存储了许多数据。

“组态王对关系数据库的查询”例程说明文档

图一 原料数据表

3.2 设置ODBC数据源

1)在“控制面板”-“管理工具”-“ODBC数据源”中建立ODBC数据源,点

击“ODBC数据源”弹出“ODBC数据源管理器”,如下图二所示:

2)在“系统DSN”中点击“添加”,弹出“选择数据源驱动程序”窗口,如下图

三所示:选择“Microsoft Access Driver (*.mdb)”驱动,点击“完成”。弹出如图四所示

窗口,填写ODBC数据源的名称,名称可以根据需要任意命名,我们命名为“数据”,

点击“选择(S)”,如图五示,选择工程路径下面的数据库文件“数据.mdb”。点击“确

定”完成ODBC数据源的定义,如图六所示。其他数据库如SQLServerODBC定义

请参考相关文档。

“组态王对关系数据库的查询”例程说明文档

图二 ODBC数据源管理器

图三 选择数据源的驱动程序

“组态王对关系数据库的查询”例程说明文档

图四 数据源定义

图五 选择数据库

“组态王对关系数据库的查询”例程说明文档

图六 ODBC数据源定义

3.3 利用SQL函数进行查询

利用组态王的SQL函数可以实现对数据库的记录进行查询、插入、删除等操作,

们这里只讲述如何进行查询,其他的使用请参考组态王使用手册以及函数手册。组态王

利用SQL函数进行查询时必须首先建立记录体。

3.3.1

定义变量

新建工程,然后定义变量,变量为内存变量。在组态王中定义八个变量:原料厂家

(内存字符串)、原料编号(内存字符串)、原料重量(内存实数)、日期(内存字符

串)时间(内存字符串)值班人员(内存字符串)查询日期(内存字符串)DeviceID

(内存整数)。

3.3.2

定义记录体

记录体是用来连接数据库的表格的字段和组态王数据词典中的变量。

创建记录体:如图七所示:记录体名:Bind1,字段名称为数据库中表的字段名称,

变量名称为组态王数据词典中的变量。字段类型与变量类型需要一致。字段名称要与数

据库中表的字段名称一致。变量名称与字段名称可以不同。记录体名称可以根据需要命

名。

“组态王对关系数据库的查询”例程说明文档

图七 定义记录体

3.3.3

建立组态王与数据库的关联

组态王与数据库建立与断开关联主要是通过SQL函数来实现。

通过SQLConnect()函数建立组态王与数据库的连接。

通过SQLDisconnect()函数断开组态王与数据库的连接。

本例程中数据库无用户名和密码,具体用法如下:

SQLConnect( DeviceID, "dsn=数据;uid=;pwd=");

其中DeviceID是用户在数据词典中创建的内存整型变量,用来保存SQLConnect()

为每个数据库连接分配的一个数值。

建议将建立数据库连接的命令函数放在组态王的应用程序命令语言的启动时执行,

这样当组态王进入运行系统后自动连接数据库。如下图八所示:

建议将断开数据库连接的命令函数放在组态王的应用程序命令语言的停止时执行,

这样当组态王退出运行系统时自动断开数据库的连接。如下图图九所示:

注意:此函数在组态王运行中只须进行一次连接,不要把此语句写入“运行时”,

多次执行此命令而造成错误。

“组态王对关系数据库的查询”例程说明文档

图八 建立与数据库的连接

“组态王对关系数据库的查询”例程说明文档

图九 断开与数据库的连接

3.3.4

查询数据库

数据库连接成功后,我们就可以通过执行 SQL函数对Access数据库的表中的数据

进行查询了,查询主要用到的SQL函数包括SQLSelect()SQLLast()SQLFirst()

SQLPre()SQLNext()等。详细的函数使用请参考函数使用手册。

首先利用组态王提供的画图工具新建一个组态王画面“SQLPic”,如下图十所示:

日期、时间、值班人员、原料厂家、原料编号动画连接为字符串输出,连接的变量

本站点日期、本站点时间、本站点值班人员。原料重量动画连接为模拟值输出,

连接的变量为本站点原料重量。查询日期动画连接为字符串输出、字符串输入,连接

的变量为本站点查询日期。

“组态王对关系数据库的查询”例程说明文档

图十 组态王画面

1)“数据查询”按钮的弹起时命令语言为SQL查询函数,进行数据查询:

string whe;

whe="称量日期='"+本站点查询日期+"'";

SQLSelect( DeviceID, "原料数据", "Bind1", Whe, "" );

2)“画面切换”按钮的弹起时命令语言为画面切换函数,进行画面的切换:

ShowPicture("KVADODBGridPic");

3)“下一条记录”按钮的弹起时命令语言为SQL函数,进行下一条记录的选择:

SQLNext( DeviceID );

4)“上一条记录”按钮的弹起时命令语言为SQL函数,进行上一条记录的选择:

SQLPrev( DeviceID );

5)“首记录”按钮的弹起时命令语言为SQL函数,进行首项记录的选择:

SQLFirst( DeviceID );

6)“末记录”按钮的弹起时命令语言为SQL函数,进行末项记录的选择:

“组态王对关系数据库的查询”例程说明文档

SQLLast( DeviceID );

7)“系统退出”按钮的弹起时命令语言为系统退出函数:

Exit( 0 );

关于使用到的函数的详细使用方法请参考函数使用手册或者帮助文档。

3.3.5

进入运行系统

画面开发完成后保存画面,在工程浏览器的“系统设置”“设置运行系统”“主

画面配置”中,将新建的SQLPic画面设置为主画面。确认后点击工程浏览器的View

按钮切换到运行系统。

系统运行后会将主画面打开,在查询日期处填写要查询数据的日期,点击“数据查

询”按钮则会根据查询日期查询到相应日期的数据,如下图十一所示:通过点击相应的

按钮会实现相应的功能。

图十一 运行系统画面

“组态王对关系数据库的查询”例程说明文档

3.4 利用KVADODBGrid控件进行查询

3.4.1

KVADODBGrid控件的介绍

在工程中经常需要访问开放型数据库中的大量数据,如果通过SQL函数编程查询,

因为符合条件的记录比较多,无法同时浏览所有的记录,并且无法形成报表进行打印,

不易使用。针对这种情况,组态王提供了一个通过ADO访问开放型数据库中数据的

Active X控件-KVADODBGrid。通过该控件,在组态王画面中用户可以很方便的访问

数据库、编辑数据库。可以通过数据库查询窗口对数据库中的数据进行查询,也可以用

控件的统计函数计算出控件中数据的最大、最小值和平均值等。具体的此函数的属性、

方法以及详细的使用请参考组态王使用手册或者组态王帮助。

3.4.2

KVADODBGrid控件的使用

在工程中新建画面“KVADODBGridPic”,单击工具箱中的“插入通用控件”按钮

则弹出“插入控件”对话框。在“插入控件”对话框内选择“KVADODBGrid Class

控件,如图十二所示,在此画面中放入此控件。双击此控件,为控件命名,控件名称可

以根据需要确定,我们命名为“KV”。

“组态王对关系数据库的查询”例程说明文档

图十二 插入通用控件

选择控件,单击右键,在弹出的菜单中选择“控件属性”。弹出控件固有属性对话

框,如下图十三所示。

点击“浏览”按钮弹出“数据链接属性”如图十四所示,选择“连接”选项卡,在

“指定数据源”处选择“使用数据源名称”选项,通过下拉列表选择我们前面所定义的

ODBC

“组态王对关系数据库的查询”例程说明文档

图十三 KV控件属性

数据源“数据”,点击“确定”,返回图十三画面,“数据源”与“数据库”连接

完成,下面进行数据表的配置。

在“表名称”处选择我们需要查询的数据表“原料数据”。选择完成后,数据表的

字段会显示在“有效字段”栏,我们可以将需要的字段添加到右边,在添加过程中可以

对标题以及格式等进行相应的修改,如图十五所示:点击“确定”完成对KV控件的配

置。

“组态王对关系数据库的查询”例程说明文档

图十四 数据链接属性

“组态王对关系数据库的查询”例程说明文档

图十五 KV控件配置

配置完成后KVADODBGrid控件在画面上的显示如图十六所示:同时按下键盘的

Ctrl”+“Alt”+“O”可以对控件的列宽进行设置,我们可以根据字段内容的多少

设置合适的列宽以增加画面的美观程度。设置完成后的画面如图十七所示:

“组态王对关系数据库的查询”例程说明文档

图十六 KV控件

在此基础上,我们进行数据查询功能的实现。如图十八所示为最后完成的画面。

其中查询日期的动画连接为字符串输入、字符串输出,连接的变量为本站点查询

日期。

“数据查询”按钮的弹起时命令语言为调用KV控件的属性方法进行记录查询:

string whe;

whe="称量日期='"+本站点查询日期+"'";

=whe;

ata();

nd();

控件.Where属性:设置查询条件,如果不需要任何条件,则可以设置为空。

控件.FetchData方法:执行数据查询,并将查询到的数据集填充到控件中。

控件.FetchEnd方法:结束查询。

“组态王对关系数据库的查询”例程说明文档

图十七 KV控件

图十八 KVADODBGrid控件查询画面

“组态王对关系数据库的查询”例程说明文档

“打印”按钮的弹起时命令语言为KV控件的打印的方法,进行打印操作:

();

“画面切换”按钮的弹起时命令语言为画面切换函数,进行画面的切换:

ShowPicture("SQLPic");

“按条件查询”按钮的弹起时命令语言为调用控件的QueryDialog()方法在弹出的对

话框中填入查询条件实现数据查询,具体用法请参看组态王帮助:

long aa;

aa=ialog();

if(aa==1)

{

ata();

nd();

}

“保存”按钮的弹起时命令语言为调用控件的SaveToCSV ()方法,把查询出来的数

据保存成CSV格式文件,可以用EXCEL打开查看:

string filename;

filename=InfoAppDir()+StrFromReal(本站点$, 0, "f" )+StrFromReal(本站点$,

0, "f" )+StrFromReal($, 0, "f" )+StrFromReal($, 0,

"f" )+StrFromReal(本站点$, 0, "f" )+StrFromReal(本站点$, 0, "f" )+".csv";

CSV(filename);

在使用KVADODBGrid控件过程中用到的控件的属性、方法请参考手册或者帮助文

档。

3.4.3

利用日期时间控件实现按日期查询

也是利用KVADODBGrid控件来实现的,上面介绍的是直接在文本对话框里输入日

期实现数据查询,下面介绍通过调用通用控件里的日期时间控件来查询数据,这种方法

是可以直接选择日期时间,使用起来简单方便,具体实现方法如下:

1在组态王画面中添加两个日期时间控件即:Microsoft Date and Time Picker Control

6.0,控件名称分别为date1date2

2)在date1控件的CLOSEUP事件中输入如下命令语言:

“组态王对关系数据库的查询”例程说明文档

long year1;

long month1;

long day1;

year1=;

month1=;

day1=;

string 查询开始时间;

if(month1<10&&day1<10)

{

=StrFromInt(year1, 10)+"-"+"0"+StrFromInt(month1,

10)+"-"+"0"+StrFromInt(day1, 10);

}

if(month1<10&&day1>=10)

{

=StrFromInt(year1, 10)+"-"+"0"+StrFromInt(month1,

10)+"-"+StrFromInt(day1, 10);

}

if(month1>=10&&day1<10)

{

=StrFromInt(year1, 10)+"-"+StrFromInt(month1,

10)+"-"+"0"+StrFromInt(day1, 10);

}

if(month1>=10&&day1>=10)

{

=StrFromInt(year1, 10)+"-"+StrFromInt(month1,

10)+"-"+StrFromInt(day1, 10);

}

本站点开始时间=查询开始时间;

3)在date2控件的CLOSEUP事件中输入如下命令语言:

“组态王对关系数据库的查询”例程说明文档

long year2;

long month2;

long day2;

year2=;

month2=;

day2=;

string 查询结束时间;

if(month2<10&&day2<10)

{

=StrFromInt(year2, 10)+"-"+"0"+StrFromInt(month2,

10)+"-"+"0"+StrFromInt(day2, 10);

}

if(month2<10&&day2>=10)

{

=StrFromInt(year2, 10)+"-"+"0"+StrFromInt(month2,

10)+"-"+StrFromInt(day2, 10);

}

if(month2>=10&&day2<10)

{

=StrFromInt(year2, 10)+"-"+StrFromInt(month2,

10)+"-"+"0"+StrFromInt(day2, 10);

}

if(month2>=10&&day2>=10)

{

=StrFromInt(year2, 10)+"-"+StrFromInt(month2,

10)+"-"+StrFromInt(day2, 10);

}

本站点结束时间=查询结束时间;

4)在画面上添加一按钮,在按钮的弹起时输入如下命令语言:

“组态王对关系数据库的查询”例程说明文档

string whe;

whe="称量日期>='"+本站点开始时间+"' and称量日期<='"+本站点结束时间

+"'"+" ORDER BY '称量日期' ASC";

=whe;

ata();

nd();

3.4.4

进入运行系统

画面开发完成后保存画面,然后点击工程浏览器的“View”按钮切换到运行系统。

通过主画面“SQLPic”画面中的“画面切换”按钮切换到“KVADODBGridPic”画面,

系统运行后会将主画面打开,设置需要查询的日期后点击“数据查询”按钮,即可在控

件中的得到查询的结果,如下图十九所示:

点击“打印”即可在打印机上面进行打印输出。

本控件的其他功能的实现请参考组态王手册以及组态王帮助文档。

图十九 KVADODBGrid控件运行画面

“组态王对关系数据库的查询”例程说明文档

4. 注意事项

1)记录体的中变量的数据类型和数据库表中的字段类型必须一一对应和匹配。

比如:数据库的表的字段的单精度类型与组态王变量的实数类型相匹配,字段的整

数类型与组态王变量整数类型相匹配,字段的文本类型与组态王变量的字符串类型相匹

配。

2SQL函数在执行中出现问题请参考信息窗口的错误提示信息。

3)不同的数据库在ODBC数据源的定义是不一样的,请参考相关文档。