天天动画片 > 八卦谈 > 基于LabVIEW和LabWindows/CVI的数据库编程

基于LabVIEW和LabWindows/CVI的数据库编程

八卦谈 佚名 2024-02-03 14:27:27

        LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。

        LabWindows/CVI是NI公司推出的交互式C语言开发平台。它的集成化开发环境、交互式编程方法、函数面板和丰富的库函数大大增强了语言的功能。它是一种32位的面向计算机测控领域的虚拟仪器软件开发工具,可在多操作系统下运行。是以ANIS C为核心的交互式虚拟仪器开发环境,将功能强大的C语言与测控技术有机结合。

        SQL Server由微软开发的数据库管理系统,是Web上比较流行的用于存储数据的数据库,它广泛用于电子商务、银行、保险、电力等与数据库有关的行业。 SQL Server通过Web对数据进行轻松安全的访问,具有强大的、灵活的、基于Web的和安全的应用程序管理等,操作简洁,界面友好。

        在用LabVIEW或者LabWindows/CVI进行数据采集分析过程中,一般会用到数据库。在数据量很大的场合,可考虑使用SQL SERVER。下面就分别介绍LabVIEW和LabWindows/CVI与SQL SERVER的连接方法。

基于配置ODBC数据源的方法访问SQL Server数据库

1.  在Windows10  32bit下,可以通过“控制面板/Control Panel”->“管理工具/Administrative Tools”->“数据源(ODBC) /Data Sources (ODBC)”打开(如果是64bit,可以通过如下路径打开C:\Windows\SysWOW64\ odbcad32),将ODBC数据源管理器切换到“用户DSN”选项卡,然后单击“Add”按钮;

  2.  选择SQL server项并单击“完成”按钮;

 3.  此时将会弹出“创建到SQL server的新数据源”对话框。给数据源起个名字为zhangxing, 在“服务器”下拉列表中选择要做为数据源的服务器JINLING(服务器的名称可以从SQL Server Management Studio登陆界面获得),或者直接输入数据库服务器的IP地址,然后点击下一步;

4.  根据数据库服务器的登录验证方式(Windows验证、SQL Server验证)做适当选择,如果是SQL Server验证,输入用户名和密码(账号和密码可以从SQL Server Management Studio登陆界面获得),然后点击下一步;

5.  更改数据库: 选择您想要连接的数据库zhangxing;其余的按默认设置,如下图所示,然后单击下一步按钮;

 6.  选择语言,再点击“完成”按钮;

  7.  最后点击“测试数据源”;

8.  接着会弹出一个窗口,测试成功:

 9.  最后成功,我们的新建的数据源列在了列表中;

常用的SQL语言

1.SELECT 语句用于从表中选取数据;

SELECT 列1名称,列2名称,...列n名称 FROM 表名称;

SELECT * FROM 表名称(其中*带表全部);

2. INSERT INTO 语句用于向表格中插入新的行;

用于插入表的全部列值,INSERT INTO 表名称 VALUES (值1, 值2,....值n);

也可以指定所要插入数据的列,INSERT INTO table_name (列1名称,列2名称,...列n名称) VALUES (值1, 值2,....值n)

3. Update 语句用于修改表中的数据。

UPDATE 表名称 SET 列1名称= 新值,列2名称= 新值,...列n名称= 新值 WHERE 列名称 = 某值;

其中WHERE是当某列满足一定的条件时候才更新

4. DELETE 语句用于删除表中的行。

DELETE FROM 表名称 WHERE 列名称 = 值;

其中WHERE是当某列满足一定的条件时候才删除;

Labview连接SQL Server数据库

       由于LabVIEW本身并不具备数据库访问功能,因此以LabVIEW编制的虚拟仪器系统需要其它辅助的方法来进行数据库访问。在LabVIEW编程环境下,LabVIEW对SQL Server数据的访问主要由NI公司的附加工具包LabVIEW SQL Toolkit进行数据库访问:本程序利用Database Connectivity中5个VI构成(DB Tools Open Connection,DB Tools Execute Query,DB Tools Fetch Recordset Data,DB Tools Free Object,DB Tools Close Connection),开发人员只需要在DB Tools Open Connection中字符串常量控件“connection information”处输入DSN= zhangxing即可(其中zhangxing是ODBC配置时候指定的名称),然后在SQL指令处读写操作需要输入SQL语言即可。

工具包介绍

1.  DB Tools Open Connection.vi:打开数据库连接

2.  DB Tools Close Connection.vi:关闭数据库连接

3.  DB Tools Execute Query.vi:执行输入的SQL语句,并返回一个数据库引用

4.  DB Tools Fetch Recordset Data.vi:根据记录引用从文件中获取数据

5.  DB Tools Free Object.vi:通过释放引用来关闭目标

Labview连接SQL Server数据库实例

1.主界面

2.数据库读取数据程序

3. 数据库数据查询程序

4. 数据库修改数据程序

5. 数据库删除选定数据程序

6. 数据库添加数据程序

LabWindows/CVI连接SQL Server数据库

        LabWindows/CVI SQL Toolkit是用于CVI数据库访问的附加工具包,它集成了一系列的高级功能模块,这些模块封装了大部分的数据库操作和一些高级数据库访问功能。LabWindows/CVI SQL Toolkit支持主流的数据库驱动,对于数据库开发商及第三方开发者提供的驱动,LabWindows/CVI SQL Toolkit也一样采用标准的ODBC编译方式,通过这种扩展方式,可以灵活支持任何符合ODBC开发标准的数据库系统。由于其包含了丰富的数据库操作函数,给开发带来了方便和快捷。

基本函数介绍

1. DBConnect函数:创建一个与数据库系统的连接。

例如:hdbc = DBConnect ("DSN=zhangxing");

2. DBDisconnect函数:关闭数据库连接。

例如:DBDisconnect (hdbc);

3. DBActivateSQL函数:激活一个SQL语句。

4. DBPrepareSQL函数:准备执行一条SQL语句。

5. DBExecutePreparedSQL函数:执行一条SQL语句。

例如:DBExecutePreparedSQL (hstat);

6.DBCreateParamChar函数:为存储过程或SQL语句创建一个字符型参数变量。

7.DBClosePreparedSQL函数:关闭SQL语句。

8. DBBindColChar函数:将字符型字段绑定到变量中。

9. DBDeactivateSQL函数:释放SQL语句所占用的系统资源。

LabWindows/CVI连接SQL Server数据库实例

1.主界面

2.数据库读取数据部分代码

hstat = DBActivateSQL (hdbc, "SELECT *FROM zhangxing.dbo.equipment");//选取表中所有的数据                                                          

resultcode = DBBindColChar (hstat, 1, 50, equid, &equidstatus, "");             

resultcode = DBBindColChar (hstat, 2, 50, equipmentname, &equipmentnamestatus, "");  

resultcode = DBBindColChar (hstat, 3, 50, equipmenttype, &equipmenttypestatus, "");  

resultcode = DBBindColChar (hstat, 4, 50, equipmentaddress, &equipmentaddressstatus, "");

resultcode = DBBindColChar (hstat, 5, 50, equipmentfactory, &equipmentfactorystatus, "");        

total = DBNumberOfRecords (hstat);//获得总的记录数

 int data[total];

DeleteTableRows (equpanel, EQUPANEL_EQUTABLE, 1, -1);//删除现在CVI中的设备信息表中的内容 

InsertTableRows (equpanel, EQUPANEL_EQUTABLE, 1, total, VAL_USE_MASTER_CELL_TYPE);//将数据插入CVI中的设备信息表中

SetCtrlAttribute (equpanel, EQUPANEL_EQUTABLE, ATTR_VISIBLE, 0);     

          if(total>0)

             {

             while (DBFetchNext(hstat) != DB_EOF)

                 {

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(1,i), equid);     //将绑定的信息在CVI中的设备信息表中显示出来

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(2,i), equipmentname); 

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(3,i), equipmenttype); 

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(4,i), equipmentaddress); 

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(5,i), equipmentfactory);             

                    i++;

                 }

 SetCtrlAttribute (equpanel, EQUPANEL_EQUTABLE, ATTR_VISIBLE, 1);

                 DBDeactivateSQL (hstat);

             }

3.数据库数据查询部分代码

hmap = DBBeginMap (hdbc); //利用SQL TOOKIT映射数据表

                

  DBMapColumnToChar (hmap, "equid", 50, equid, &equidstatus, "");

  DBMapColumnToChar (hmap, "equipmentname", 50, equipmentname, &equipmentnamestatus, "");

  DBMapColumnToChar (hmap, "equipmenttype", 50, equipmenttype, &equipmenttypestatus, "");

  DBMapColumnToChar (hmap, "equipmentaddress", 50, equipmentaddress, &equipmentaddressstatus, "");

  DBMapColumnToChar (hmap, "equipmentfactory", 50, equipmentfactory, &equipmentfactorystatus, "");

                    

         hstmt = DBActivateMap (hmap, "equipment");//激活数据表

           GetCtrlVal (equpanel, EQUPANEL_EQUFINDCONDITION, &equfindcondition);    

                     while(DBFetchNext (hstmt)!=DB_EOF)

                     {

                            switch(equfindcondition)

                                   {  

                                          //以设备ID为查询条件

                                          case 1:         

              GetCtrlVal (equpanel, EQUPANEL_EQUID, equidbuffer);

                                                 strncpy(equid1,equid,strlen(equidbuffer));

                  if(strcmp(equidbuffer,equid1)==0)//当存在与查询的用户名一致的记录时标定flag=1

                                                        {

                                                               flag=1;

                                                               break;

                                                        }

                                               break;

……

case 3://清除设备信息表中的所有内容后,重新插入符合查询条件的记录

sprintf(sqlcommand,"SELECT *FROM zhangxing.dbo.equipment WHERE equipmentfactory='%s'",factorybuffer);               

 hstat = DBActivateSQL (hdbc, sqlcommand);//选取表中所有的数据

          // 分别对数据库字段对应的数据进行绑定                 

resultcode = DBBindColChar (hstat, 1, 50, equid, &equidstatus, "");

resultcode = DBBindColChar (hstat, 2, 50, equipmentname, &equipmentnamestatus, "");//

resultcode = DBBindColChar (hstat, 3, 50, equipmenttype, &equipmenttypestatus, "");

resultcode = DBBindColChar (hstat, 4, 50, equipmentaddress, &equipmentaddressstatus, "");

resultcode = DBBindColChar (hstat, 5, 50, equipmentfactory, &equipmentfactorystatus, "");

                                         

 total = DBNumberOfRecords (hstat);//获得总的记录数

DeleteTableRows (equpanel, EQUPANEL_EQUTABLE, 1, -1);//删除现在CVI中的设备信息表中的内容             

 InsertTableRows (equpanel, EQUPANEL_EQUTABLE, 1, total, VAL_USE_MASTER_CELL_TYPE);//将数据插入CVI中的设备信息表中

                    

                                          if(total>0)

                                                 {

                                                        while (DBFetchNext(hstat) != DB_EOF)

                                                               {

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(1,i), equid);            //将绑定的信息在CVI中的设备信息表中显示出来

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(2,i), equipmentname);  //

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(3,i), equipmenttype);  //

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(4,i), equipmentaddress); //

SetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(5,i), equipmentfactory);  

                                                                      i++;

                                                               }

             

                                                 }

                                                 else

                                                 {

                                                     MessagePopup ("提示", "你所查询的设备未找到!");    

                                                 }  

4.数据库修改数据部分代码

SetCtrlAttribute (equpanel, EQUPANEL_EQUTABLE, ATTR_CTRL_MODE, VAL_HOT);//激活CVI的设备信息表           

GetActiveTableCell (equpanel, EQUPANEL_EQUTABLE, &colrow);//获得活动表格当前的行与列

GetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(1, colrow.y), equid);      // 获得本行第1列中的设备ID

GetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(2, colrow.y), equipmentname);// 获得本行第2列中的设备名称

GetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(3, colrow.y), equipmenttype);// 获得本行第3列中的设备型号

GetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(4, colrow.y), equipmentaddress);// 获得本行第4列中的设备地址

GetTableCellVal (equpanel, EQUPANEL_EQUTABLE, MakePoint(5, colrow.y), equipmentfactory); //获得本行第5列中的设备生产厂家

 hstat = DBPrepareSQL (hdbc, "UPDATE zhangxing.dbo.equipment SET equipmentname = ?, equipmenttype = ?, equipmentaddress = ?, equipmentfactory = ? WHERE equid = ?");

resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equipmentname, strlen(equipmentname)+1);

 resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equipmenttype, strlen(equipmenttype)+1);

resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equipmentaddress, strlen(equipmentaddress)+1);

resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equipmentfactory, strlen(equipmentfactory)+1);

resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equid, strlen(equid)+1);

resultcode = DBExecutePreparedSQL (hstat);

DBClosePreparedSQL (hstat);

 ReadEQUTab(equpanel,EQUPANEL_READEQUTAB,EVENT_COMMIT,NULL,0,0);

5.数据库删除选定数据部分代码

hstat = DBPrepareSQL (hdbc, "DELETE FROM zhangxing.dbo.equipment WHERE equid = ?");

resultcode = DBCreateParamChar (hstat, "", DB_PARAM_INPUT, equid,50);        

resultcode = DBExecutePreparedSQL (hstat);

DBClosePreparedSQL (hstat);

6.     数据库添加数据部分代码

hstat = DBPrepareSQL (hdbc, "INSERT INTO zhangxing.dbo.equipment VALUES (?,?,?,?,?)");                             

esultcode = DBCreateParamChar (hstat, "equid", DB_PARAM_INPUT, equid, 50);//一切同用户管理事件

resultcode = DBCreateParamChar (hstat, "equipmentname", DB_PARAM_INPUT, equipmentname, 50); 

resultcode = DBCreateParamChar (hstat, "equipmenttype", DB_PARAM_INPUT, equipmenttype, 50); 

resultcode = DBCreateParamChar (hstat, "equipmentaddress", DB_PARAM_INPUT, equipmentaddress, 50);

resultcode = DBCreateParamChar (hstat, "equipmentfactory", DB_PARAM_INPUT, equipmentfactory, 50);

resultcode = DBExecutePreparedSQL (hstat);

DBClosePreparedSQL (hstat);

                 ReadEQUTab(equpanel,EQUPANEL_READEQUTAB,EVENT_COMMIT,NULL,0,0);

      实践证明,LabVIEW和LabWindows/CVI利用自身的数据库访问工具包实现对数据库的访问,操作更简洁,容易理解,不用精通ActiveX技术和SQL语言(只需要熟悉基本的SQL语言),充分利用了现有的资源,就可以对数据库进行实时操作。


本文标题:基于LabVIEW和LabWindows/CVI的数据库编程 - 八卦谈
本文地址:www.ttdhp.com/article/47111.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们