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语言),充分利用了现有的资源,就可以对数据库进行实时操作。
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪