《电子技术应用》
您所在的位置:首页 > 通信与网络 > 设计应用 > 基于Webaccess平台的SQL server数据库的应用
基于Webaccess平台的SQL server数据库的应用
来源:微型机与应用2013年第1期
魏 凯,张天开,王显静,孙亦霖
(青岛理工大学 自动化学院,山东 青岛 266033)
摘要: 介绍了采用SQL数据库,分别在Webaccess脚本、VB采集程序和Delphi的检测程序中调用,解决大量数据的流通及存储的问题。
关键词: WebAccess 数据库 SQL ADO ODBC
Abstract:
Key words :

摘  要: 介绍了采用SQL数据库,分别在Webaccess脚本、VB采集程序和Delphi的检测程序中调用,解决大量数据的流通及存储的问题。
关键词: Webaccess;数据库;SQL;ADO;ODBC

 某空调通风试验台以Webaccess作为软件平台,用于采集测点数据、执行算法并输出控制信号。但在空调通风试验台的项目中,风速、压力和温度总共有140个采集点,如果采用Webaccess内部点,无法进行存储。因为这些点的数据要被实时地保存。为此,本文介绍了基于Webaccess平台、采用SQL sever作为本工程节点的数据保存数据库,同时也考虑了可以方便其他局域网的应用程序访问本机上的数据,以作为分析的依据。
 在本系统中,应用程序访问SQL数据库通过ODBC或ADO两种方式。ODBC是微软开发的数据库编程接口,应用程序可以通过ODBC访问来自不同数据库管理系统的数据。在Windows系统中,包含有ODBC接口的管理程序,如果要使用ODBC数据源,必须首先创建和配置数据源。ODBC管理器根据数据源提供的数据库的位置、数据库的类型和ODBC驱动程序,建立与数据库的连接,应用程序对数据库的操作通过ODBC完成。ADO是微软提供的一种面向各种数据源的高级接口,开发人员只需编写访问数据库的代码而不用去关心如何去实现,即只要关心和数据库的连接;ADO通过OLE DB访问和操作数据库服务器中的数据,通过ADO可以连接数据库,并且指定访问数据源的命令,最后执行命令。
 在本系统中,连接一个本地SQLserver,并在这个服务器中建立了一个shuju数据库,这个数据库含有10个数据表,分别为:1个存储修正值的表,3个实时的数据保存数据表,3个数据坐标直接读取表和3个历史坐标存储总表。Webaccess在采集数据之后,存入数据库,数据库再把数据分享到局域网。整个系统的数据流向图如图1所示。

1 通过ODBC访问数据库
 在Windows系统中,采用Webaccess作为软件平台,其本身支持对数据库的读写,但需要在Windows的ODBC管理器中添加ODBC数据源。在Windows XP系统的控制面板的管理工具中,数据源管理器中添加SQL server驱动、命名、选择服务器,然后添加数据库shuju,测试连接即完成。每次在脚本中执行SQL语句、进行操作数据库之前,必先连接数据源。下面介绍如何连接shuju数据库、读写存储温度的数据表TDATATABLE和存储矫正值的数据表xiuzheng。
 (1)在xiuzheng数据表中存储了在Webaccess中对每个点的传感器数据的矫正值,每当每个点的数据存储到数据库之前,必须读取xiuzheng表中的矫正值,加到读入的数据值上。其代码如下:
SQLDIRECT”CONNECT SESSION 1 TO shuju,sa,”  
 #建立与数据库的连接,用户名为sa,密码为空[1]
 SQLDIRECT "USE SESSION 1"  #使用连接
 SQLPREPARE "DECLARE C1 CURSOR FOR "  
 #这一条语句从数据库flag=1处读取,并记录到缓存
 SQLPREPARE"SELECTTO1,TO2,TO3,TO4,TO5,TO6,TO7,TO8,TO9,TO10,"
 …...
 SQLPREPARE "TO51,TO52,TO53,TO54,TO55,TO56,TO57,TO58,TO59,TO60"
 SQLPREPARE "FROm xiuzheng WHERE Flag=1"
 SQLEXECUTE  #sql语句执行
 SQLDIRECT "OPEN C1"  
 #将缓存中的数据读取到本地点中
 SQLPREPARE "FETCH NEXT C1 INTO m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,"
 ……
 SQLPREPARE"m51,m52,m53,m54,m55,m56,m57,m58,m59,m60"
 SQLEXECUTE
 SQLDIRECT "CLOSE C1"  #关闭连接
 set m1 [expr $m1+[GETVAL TT1]]  
 #将驱动读取到传感器的数据加上矫正值
 set m2 [expr $m2+[GETVAL TT2]]
 ……
 set m60 [expr $m60+[GETVAL VV60]]
 (2)将读到的传感器测量的点的数值加上矫正值存储到TDATATABLE。其代码如下:
 SQLDIRECT”CONNECT SESSION 1 TO shuju,sa,”
 #连接数据库
 SQLDIRECT”USE SESSION 1”
 SQLPREPARE”INSERT INTO TDATABASE VALUES(”SQLPREPARE”'[GETVAL  %TI
 MDATE]','[GETVAL %TTMTIME]'”
 SQLPREPARE” $m1,$2, $m3,$m4,$m5,”
 ……
 SQLPREPARE”$m56,$m57,$m58,$59,$m60)”
 #将系统日期,时间和局部点读取到TDATEBASE数据表中
 SQL.EXECUTE
 SQLDIRECT”DISCONNECT SESSION1”
2 通过ADO接口连接到数据库
 (1)在Webaccess中局部点存储了坐标值,只有当局部点文件被加载时才能把这些点赋值。本文采用在Webaccess的总体脚本中添加VB辅助程序、运行总体脚本时在VB程序中给这些局部点赋值。
 在VB辅助程序中,VB控件作为第三方控件在Webaccess平台中实现与数据库的连接。由于嵌入到Webaccess中的控件是通过bwocxrun.exe与Webaccess通信,因此要把bwocx.ocx引用到VB中。在VB中新建ActiveX控件—>工程—>部件bwocxrun ActiveX Control modole—>接口向导—>hWnd—>映射到UserControl—>数据类型为string—>在空白处添加ocx控件。
 在VB控件中建立与SQL数据库的连接,本系统采用ADO连接数据库,而在VB中采用ADO接口。主要有两种方式:一是采用ADOdata控件连接数据库,二是采用ADO对象与数据库连接。在采用第二种方式时还有两种方式:分别是ADO对象和ODBC数据源连接或者ADO对象和指定的OLE DB提供者连接数据库。本文采用ADO对象和指定的OLE DB连接方式。以下是与TXYZTABLE的连接:
 Dim conn As New ADODB.Connection
 Dim rs As New ADODB.Recordset
 Private sub form_load()
 Set conn=New ADODB.Connection
 Set rs=New ADODB.Recordset
 Dim s1,s2 As String
 Dim ft1,ft2…..as byte
 Dim xt1,yt1,zt1…as single
 conn.ConnectionString=”driver={sqlserver};server=127.0.0.1;uid=sa;pwd=;Connection  Timeout=0;Database=shuju”  
 ′与数据库建立连接的字符串[2]
 conn.open ′建立与数据的连接
 ft1=Bwocxrun1.GetValue(“FT1”,ME.AP)
 ′通过Bwocxrun控件将Webaccess中的点读到VB中的变量[3]
 xt1=Bwocxrun1.GetValue(“XT1”,ME.AP)
 yt1=Bwocxrun1.GetValue(“YT1”,ME.AP)
 zt1=Bwocxrun1.GetValue(“ZT1”,ME.AP)
 ……..
 S1=”USE shuju”
 conn.Execute s1
 s2=”INSERT INTO TXYZTABLE VALUES(1,”&ft1&”’,’”&xt1&”’,’”&yt1&”’,’”&zt1&”,’……’)”
 conn.Exexute s2
 ′将这些变量存储到shuju数据库的TXYZTABLE表中
 (2)在本系统中,由于如果改变测点额定坐标,将会使以前的坐标信息全部丢失。为了存储过去的历史坐标,系统建立了一个历史坐标数据表。利用Delphi编写了一个辅助程序将当前的测点坐标存储到数据库中,当测量点修改后,可以运行该程序将改动的坐标存储到历史坐标数据库中。当在使用以前的测量点时,也可以在程序中选择以前存储的历史坐标加载到测量点的局部点。
 使用Delphi编写试验坐标处理程序时,其程序采用ADO数据库访问接口进行连接数据库,采用ODBC驱动程序连接数据源。图2为该程序的界面。

 

 

 在编写程序时,需要在新建的窗体上添加ADOConnection和ADOQUERY控件。其中这ADOConnection的connectionstring属性为”Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Data Source=shuju”,并为ADOQUERY添加connection属性为ADOConnection的name[4]。
在MPXYZTABLE中,每一条记录的第一个字段表示第几条实验记录。下面是以压力历史坐标表演示将数据编号读出,并将选择的编号的数据记录读取到坐标数据表的示例:
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add(′SELECT*FROM MPXYZTABLE′); //连接数据库选择数据表
 ADOQuery1.Open; //打开数据表
 j:= ADOQuery1.RecordCount;
 ……
 ADOQuery1.FindFirst;
 for i:=0 to j-2 do
 begin ComboBox1.Items.Add(ADOQuery1.Fields[0].Value);  //将编号提取到下拉控件中显示
 testname[i]:=ADOQuery1.Fields[0].Value;
 ADOQuery1.FindNext;  //下一条记录
 下面是把历史坐标中选择的编号相应的记录输出到全局变量中,然后把这些变量再写入到坐标表中的代码:
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add(′SELECT*FROM MTXYZTABLE WHERE FLAG=′′′+ComboBox1.Text+′′′′);
 ADOQuery1.Open;
    for i:=1 to 240 do
      begin
 if ADOQuery1.Fields[i].Value=NULL then
    //检测记录是否为空
       begin
         data[i]:=0;
       end
 else
  data[i]=ADOQuery1.Fields[i].Value;   
         //把MTXYZTABLE中的数据读到数组中
 end;
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add(′update TXYZTABLE setFLAG=′′′+inttostr(1)+′′′,FT1=′′′+floattostr(data[1])+′ ′′,XT1=′′′+floattostr(data[2])+′′′,YT1=′′′+floattostr(data[3])+′′′,ZT1=′′′+floattostr(data[4])+′′′,′ );
 ……
 ADOQuery1.SQL.Add(′FT2=′′′+floattostr(data[57])+′′′,XT2=′′′+floattostr(data[58])+′′′,YT2=′′′+floattostr(data[59])+′′′,ZT2=′′′+floattostr(data[60])+′′′,′);  
 //把数组中的值写入到坐标数据表TXYZTABLE
 以上就是在Webaccess中SQL数据库的调用和操作。在实际的应用中只要掌握简单的查询语句,就可以对数据库进行操作。
参考文献
[1] 研华(中国)公司自动化事业群.Advantech WebAccess产品使用手册[S].2009.
[2] 陈艳峰,高文姬,邵蕴秋,等.Visul Basic 数据库项目案例导航[M].北京:清华大学出版社,2004.
[3] 刘德生,张天开.基于VB的WebAccess组态功能扩展[J].微型机与应用,2011,30(12):29.
[4] 郑阿奇.Delphi实用教程[M].北京:电子工业出版社,2006.

此内容为AET网站原创,未经授权禁止转载。