首页 / 资讯中心 / 文章详情

LabVIEW连接SQL Server本地数据库:Navicat建库与ODBC配置全指南

LabVIEW连接SQL Server本地数据库:Navicat建库与ODBC配置全指南 ★ FEATURED ARTICLE
1. 这个需求到底在解决什么问题做工业测试和上位机开发的人迟早会在LabVIEW面前遇到数据库这道坎。你辛辛苦苦把传感器数据、测试波形、设备状态都采上来了结果程序一关数据全没领导要月度报表的时候你只能翻Excel截图。这个时候把数据写进数据库就成了唯一出路。标题里提到的“LABVIEW连接Navicat for SQL Server本地数据库”其实就是一条非常典型的落地路径用Navicat管理本机的SQL Server实例负责建库、建表、查数据这些脏活累活LabVIEW这边只干一件事——通过ODBC把采集结果写进去。先把这个概念说清楚因为很多人一开始就绕迷糊了。Navicat本身只是一个数据库客户端工具它不是数据库引擎更不是“连接通道”。你实际要连的目标是SQL Server数据库而Navicat的角色是给你一个可视化界面帮你在这个数据库里建表、写SQL、看数据。所以标题的完整含义是我本机上跑着一个SQL Server实例建库建表和日常维护都用Navicat来做现在要让LabVIEW程序能够访问这个SQL Server里的数据。把这一层理解透了后面所有配置就不会乱。这个方案适合谁来参考一是用LabVIEW做数据采集、测试测量上位机的工程师二是实验室里想把实验数据自动入库的研究人员三是刚接手“设备加数据库联调”项目、被一堆报错搞得头疼的新手。只要你的目标是“LabVIEW写的程序能往本机数据库里存数据、能查数据”这篇文章里的每一步都可以直接照着抄。2. 动手前先把三个角色和数据库地基理清楚2.1 三个组件各管什么动手之前一定先把体系理清楚我见过太多人上来就装一堆软件最后报错都不知道是谁报的。这套方案里其实有三个独立角色少一个都玩不转。第一个是SQL Server数据库引擎。它是真正存储数据的地方在Windows上是一个后台服务。没有它Navicat连个寂寞LabVIEW也没东西可连。你需要确保这个服务已经在运行并且知道它的实例名和端口。第二个是Navicat客户端。它是数据库的图形化管理器用来执行建库、建表、增删改查这些SQL操作。它不是必须装在运行LabVIEW的那台机器上但既然是本地数据库装在同一台机器上最省事。第三个是LabVIEW及其数据库连接工具包。LabVIEW本身不直接认识SQL Server它需要借助ODBC或ADO驱动来访问数据库。这里有一个很容易犯的错只装了Navicat、没装SQL Server本体或者觉得有了Navicat就等于有了数据库那都不行——必须真的有数据库引擎服务在跑否则一切免谈。我建议的架构很简单SQL Server引擎装在本机Navicat装在本机用于管理LabVIEW通过系统的ODBC数据源指向这个SQL Server。LabVIEW和SQL Server之间的对话完全走数据库协议跟Navicat没有任何关系。Navicat只负责在你开发调试时提供便利真正跑起来以后它就是个旁观者。搞清这个关系你就不会在“为什么LabVIEW不能直接用Navicat的端口连接”这种问题上钻牛角尖了。2.2 确认SQL Server服务、开启TCP/IP协议装SQL Server的时候有个细节要记住装完不一定启动了。特别是Express版或者安装时选了“仅安装”选项服务默认可能是停止状态。你可以按WinR输入services.msc在服务列表里找到“SQL Server (MSSQLSERVER)”或“SQL Server (SQLEXPRESS)”确认状态是“正在运行”启动类型是“自动”。没启动就右键启动顺便把SQL Server Browser服务也设成自动后面用端口访问的时候它管用。还有一个必须干的事情开启TCP/IP协议。我遇到过很多“明明数据库能连LabVIEW就是连不上”的案例最后翻到SQL Server配置管理器里一看TCP/IP协议压根没启用。具体操作是打开SQL Server配置管理器左侧选“SQL Server网络配置”点击你那个实例右侧列表里有“Shared Memory”“Named Pipes”“TCP/IP”三项把TCP/IP的状态改成“已启用”然后右键实例选“重新启动”让配置生效。注意TCP/IP协议的“IP地址”选项卡里有一堆IP条目别去乱改。只要协议本身启用了默认1433端口就能用。Express版默认可能是动态端口需要单独确认一下监听端口是多少。改坏了反而容易把自己锁在门外。2.3 配置SQL Server身份验证并启用sa账号另一个高频拦截点就是登录验证。SQL Server默认装完可能是“Windows身份验证模式”也就是说只有Windows账户能登录。而LabVIEW通过ODBC连接的时候很多时候你用的是“SQL Server身份验证”也就是要输入sa账号和密码。这两种模式不兼容必须在SQL Server端提前放开。步骤是先用Navicat或SQL Server自带的管理工具以Windows身份验证方式连上实例右键实例选“属性”在“安全性”页里把“服务器身份验证”从“Windows身份验证模式”改成“SQL Server身份验证和Windows身份验证模式”。改完会提示重启服务照做就好。接下来还要给sa账号设置密码并启用它。在“安全”-“登录名”里找到sa右键属性设置一个符合复杂度要求的密码然后在“状态”页里把“登录”选项设为“启用”。这一步很多人会漏sa默认是禁用的密码再对也登不进去。我见过有人在这上面折腾了一下午最后就是这一个勾没打上。2.4 用Navicat建库建表准备一张验证用的测试表数据库地基打完之后轮到Navicat上场。打开Navicat新建一个连接类型选“SQL Server”。主机填“127.0.0.1”或者“.\SQLEXPRESS”这种写法取决于你的实例名。端口一般不用动默认1433。验证方式选“SQL Server验证”登录名填sa密码填刚才设置的那个。点击“测试连接”弹出绿色成功提示就说明数据库引擎和认证都通了。连接成功之后右键连接新建数据库比如命名为TestDB字符集保持默认或者选Chinese_PRC_CI_AS也行排序规则一般不用折腾。接着新建一张测试表。我习惯先建一张最简单的表来验证链路三个字段id是自增主键temperature是浮点型record_time是datetime。表建好后手动插一条测试数据先证明这张表真的能写能查。这张“最简单的表”非常重要。后边LabVIEW联调的时候如果写不进去或者查不出来你可以先用Navicat手动操作来定位到底是数据库本身的问题还是LabVIEW的问题不至于两边同时出问题的时候没有参照物。我每次搭数据库链路都会刻意留下一张“最小验证表”这是排查问题时的锚点。3. ODBC数据源连接链路里最关键的一环3.1 ODBC在连接链路中的角色LabVIEW要访问SQL Server最常见的路有三条一是用数据库连接工具包里的函数配合ODBC数据源来连二是直接用OLEDB或SQL Server Native Client驱动写连接字符串三是调用ODBC API自己封装。作为第一次做这个联调的人老老实实走ODBC数据源最稳也最容易排查问题。ODBC可以理解成Windows系统提供的一个“数据库翻译官”标准接口。你不需要在LabVIEW里关心SQL Server的协议细节只要告诉Windows“我要连一个叫LocalSQL的数据源它背后是SQL Server”Windows就通过ODBC驱动帮你把LabVIEW的数据库请求翻译成SQL Server能听懂的指令。这个配置是在Windows层面完成的所以LabVIEW和Navicat都不用参与。3.2 32位还是64位先把大坑填平配置ODBC的时候十个人有九个栽在位数上。Windows系统自带的ODBC管理器有两个版本64位和32位。如果你打开的是C盘System32目录里的odbcad32.exe那是64位如果想找32位版的要去SysWOW64目录下找。这个路径反直觉很多人根本找不到所以特别提一下。坑在于LabVIEW如果装的是32位版本它只能加载32位ODBC驱动对应的必须用32位数据源如果LabVIEW是64位就用64位数据源。两边位数不一致的时候LabVIEW会报“找不到数据源名称”或者干脆弹出一个SQL Server登录框然后连不上。这种报错最容易让人误判成数据库配置错了其实只是数据源位数不对。我自己的习惯是装完系统后把32位和64位的数据源各建一份名称取一样的比如都叫LocalSQL。这样不管LabVIEW是什么位数都能连上。反正多建一个DSN也就两分钟的事却能省掉一整晚的排查时间。这个习惯我到现在还在用。3.3 一步步配置系统DSNODBC数据源分“用户DSN”和“系统DSN”两类。建议配置系统DSN因为用户DSN只对当前登录用户生效如果程序跑在别的账户下或者以服务方式运行就可能“明明配了却找不到”。在ODBC数据源管理器里切到“系统DSN”选项卡点“添加”选择“ODBC Driver 17 for SQL Server”或者选你机器上实际装了的对应驱动版本。如果列表里没有SQL Server驱动说明机器上只装了Navicat而没装SQL Server的ODBC驱动包需要去SQL Server官方网站下载安装对应的ODBC驱动装完再回来刷新列表。接下来设置数据源参数。名称填LocalSQL描述可留空服务器填“127.0.0.1,1433”。然后选“使用用户输入的登录ID和密码”填入sa和密码。下一步里把“更改默认数据库为”勾上选TestDB这一步很关键免得以后每次连接都要在代码里写一遍数据库名。最后点“测试数据源”弹出“测试成功”的提示后DSN就建好了。这一步你在界面上看到的每一步背后都会写入Windows注册表所以DSN一旦建好是全局生效的。3.4 备选方案UDL文件与连接字符串如果不想碰ODBC管理界面还有一条路创建一个UDL文件。在桌面新建一个txt把扩展名改成.udl双击打开。在“提供程序”选项卡里选择SQL Server对应的OLE DB提供程序在“连接”选项卡里填服务器名和账号密码选默认数据库点“测试连接”。成功后保存这个UDL文件里的内容其实就是一段连接字符串。这段连接字符串是可以直接用在LabVIEW里的。UDL文件的好处是完全图形化配置不用记那些繁复的参数。坏处是它本身不是一个数据源每次LabVIEW连接时要读取这个文件文件被挪走或改名都会断连。两种方式我都用过日常调试用UDL方便正式项目用DSN更稳因为DSN在系统里更隐蔽不依赖外部文件路径。4. LabVIEW端代码实现从连接到写入再到查询4.1 需要的工具包和函数清单LabVIEW连接数据库的核心工具叫Database Connectivity Toolkit也就是数据库连接工具包。你得先确认自己的LabVIEW安装版本里有没有这个工具包。打开函数面板如果能找到“Connectivity”下的“Database”函数组说明工具包就位了找不到的话需要通过LabVIEW的安装管理器补装这个组件。常用到的函数有这几个DB Tools Open Connection、DB Tools Insert Data、DB Tools Select Data、DB Tools Execute Query、DB Tools Close Connection。它们的工作方式非常直白先打开连接然后执行操作最后关闭连接。记住“打开-操作-关闭”这个框架任何数据库功能都是套这个模子。这个框架跟你做文件读写是一样的套路只是函数名换了一套心理上就不怵了。4.2 连接字符串的两种写法用DB Tools Open Connection函数的时候它左上角有个“Connection Information”输入可以填DSN名称也可以直接塞一整条连接字符串。两种写法我都试过。第一种写法用DSN名字最简单DSNLocalSQL;这里只需要填你刚才在ODBC里创建的DSN名称就够了用户密码信息在DSN里已经保存过。第二种写法不依赖DSN直接指定驱动和服务器Driver{ODBC Driver 17 for SQL Server};Server127.0.0.1,1433;DatabaseTestDB;Uidsa;Pwd你的密码;TrustServerCertificateyes;第二种写法的好处是发布程序的时候可以不依赖目标机器的DSN配置但密码明文写在程序里这个隐患要想清楚。我的建议是调试验证阶段用第一种正式部署的时候把密码放到配置文件里加密读取别在程序框图上写死。4.3 完整插入数据流程下面这套流程是我在实际项目中最常用的写入路径。新建一个VI放一个DB Tools Open Connection把上面的DSN连接字符串接到“Connection Information”输入。函数会输出一个连接引用这个引用就是后面所有操作的通行证相当于文件操作里的文件句柄。接着放一个DB Tools Insert Data函数。它的三个关键输入分别是连接引用、表名、数据输入。数据输入需要你把数据组装成“表格式的数据”——在LabVIEW里通常用一个二维字符串数组表示第一维是行第二维是列内容跟数据库表的列一一对应。比如向test_temperature表插入一行数组内容就是温度值字符串和时间戳字符串顺序必须跟表的列顺序一致。有人会问插入之前要不要先连接当然要连接引用是从Open Connection函数出来的这一步省不了。还有人会问能不能直接用DB Tools Execute Query写原生SQL当然可以。我有时候更喜欢用Execute Query配合SQL语句比如INSERT INTO test_temperature (temperature, record_time) VALUES (25.6, GETDATE())用原生SQL的好处是逻辑一目了然坏处是要自己维护字符串容易因为中英文标点、引号转义问题翻车。用DB Tools Insert Data函数的好处是它帮你组装参数还能规避SQL注入风险。我的建议是简单表结构用Insert Data函数复杂逻辑用Execute Query。两者可以混着用实战项目里通常会各用一半。4.4 查询数据和关闭连接查询数据用DB Tools Select Data函数。把连接引用接进去SQL查询语句填“SELECT * FROM test_temperature”函数输出一个二维字符串数组。数组的行和列就是查询结果集的表格表示。注意这个输出全部是字符串如果你后面要做数值运算记得要加上“字符串转数值”的转换函数把温度之类的字段转回浮点数再用。最后千万别忘了DB Tools Close Connection把连接引用传进去关闭。很多初学者写程序只开不关跑一个通宵之后数据库连接数被占满新的连接再也建不起来报错内容还特别诡异。我的习惯是在程序框图里用平铺式顺序结构或者状态机来组织保证“打开连接”和“关闭连接”一一对应。打开后无论中间执行成功还是报错最终都要走到关闭这一步。4.5 错误处理的习惯数据库操作比文件操作更容易出错所以错误处理绝对省不得。LabVIEW每个数据库函数都有“Error In”和“Error Out”端子。我用一条贯穿的错误线把所有数据库函数串起来——Open Connection的Error Out接Insert Data的Error InInsert Data的Error Out再接Select Data的Error In以此类推。如果哪一步出错了后续函数会因为“错误输入不为空”而直接跳过执行这能防止在连接已经断掉的情况下继续做无意义操作。同时在错误输出端接一个简易错误处理器或者自己做一个小弹窗把错误代码和错误源显示出来。调试阶段弹窗确实烦人但等你要排查“为什么写不进去”的时候弹窗会直接告诉你“SQL Server登录失败”还是“表不存在”省掉一半猜谜时间。我遇到过不下十次报错信息一看就知道是哪个环节的问题没做错误处理的同事只能对着程序框图发呆。5. 常见报错与排查实录5.1 sa登录失败这个报错几乎每个新手都会遇到。排查顺序很明确先用Navicat用同样的sa账号密码去连SQL Server。如果Navicat也连不上说明数据库端认证配置有问题要么sa没启用要么密码不对要么验证模式还是“Windows only”按前面第2.3节的步骤重新设置。如果Navicat能连上而LabVIEW连不上问题就出在ODBC数据源这层检查DSN里填的账号密码是否跟Navicat里一致检查DSN位数是否匹配LabVIEW位数。这类问题最忌讳的就是反复在LabVIEW端改代码。数据库连接这条链路有太多环节不把排查范围缩小就动手改往往会越改越乱。我的原则是先从数据库端验证再从ODBC层验证最后才怀疑LabVIEW的代码顺序反了必走弯路。5.2 找不到DSN报错文字大概是“Data source name not found and no default driver specified”。看到这行字第一反应不是去LabVIEW里找问题而是去ODBC管理器里看DSN到底建在哪个范围、哪个位数。检查三个点第一DSN是不是真的建在了系统DSN而不是用户DSN如果程序跑的是另一个Windows账户用户DSN可能不可见第二LabVIEW是32位还是64位数据源必须同位数第三DSN名称有没有拼写大小写和空格差异。前面说的“32位64位各建一份同名DSN”的习惯就是治这个病的。5.3 TCP/IP连接被拒连着报“已成功与服务器建立连接但在登录过程中发生错误”或者“TCP/IP协议未启用”。这种一般就是SQL Server配置管理器里TCP/IP还没启用或者服务改了端口。确认TCP/IP启用后可以在命令行执行telnet 127.0.0.1 1433来看端口通不通。不通就去配置管理器里把SQL Server Browser服务改成自动并启动然后重启实例。记住改了配置之后一定要“重启服务”不是“停止再启动”而是完整的restart否则配置不生效。5.4 中文数据乱码LabVIEW往SQL Server里写中文读出来变成问号或者乱码。这个问题的根源通常出在字符集。建表时字段类型别用varchar要用nvarchar。连接字符串里最好加上字符集相关参数如果ODBC驱动支持的话同时在DSN配置时把语言设为简体中文。另外LabVIEW侧把字符串传给数据库函数前先确认字符串的编码跟数据库端一致不要Unicode和ANSI混着用。我踩过一次坑之后老老实实把所有中文字段全用nvarchar从此天下太平。5.5 工具包函数是灰色不可用有些LabVIEW安装版默认不带数据库工具包函数面板里能看到但拖不出来或者图标是灰色。这是典型的工具包未安装或未授权。去LabVIEW的安装管理器里把Database Connectivity Toolkit勾上补装或者检查许可证。如果不想装工具包也可以考虑用“调用库函数节点”直接调用ODBC API但那是另一个更折腾的方案对新手不推荐。工具包别看它名字叫“工具包”其实就是一组封装好的函数库底层做的事情跟手动调用API完全一致只是帮你把复杂的句柄管理、字符串编码、错误码转换都包掉了。5.6 快速排查清单我把自己调试中最常用的一套排查顺序整理成了表格。从上到下走一遍绝大多数连接问题都能定位。序号检查点怎么查常见故障1SQL Server服务services.msc查看运行状态服务停止2sa账号Navicat先测一遍账号禁用或密码错误3TCP/IP协议SQL Server配置管理器协议未启用4ODBC位数对照LabVIEW位数位数不匹配5DSN名称核对拼写和范围系统/用户DSN混用6默认数据库DSN属性检查指向错误库7防火墙测试1433端口端口被拦6. 从实操里沉淀的小经验6.1 先用Navicat跑通SQL再写LabVIEW这是我最推荐的工作顺序。任何要在LabVIEW里执行的SQL语句先拿到Navicat的查询编辑器里跑一遍确认语法正确、数据能查出来再复制到LabVIEW的程序框图里。两边使用的SQL方言是一致的Navicat能跑通LabVIEW基本也能跑通。这能帮你把“SQL写错了”和“LabVIEW写错了”两个问题彻底分开不要同时去猜两个变量。6.2 时间戳交给数据库端生成插入数据里的时间戳我建议用SQL Server的GETDATE()函数在数据库端生成而不是在LabVIEW里取时间再传进去。原因很简单LabVIEW程序框图上不同时刻取到的时间可能跟数据库服务器时间存在偏差而且日期时间类型在ODBC传输过程中容易出兼容问题。直接在SQL语句里写GETDATE()数据库自己解决又准又省事。6.3 批量写入用数组别一条条循环如果采集系统一秒采几百条数据千万别在程序里用for循环一条一条Insert。这种方式连接开销和SQL编译开销会把你性能拖垮。正确做法是把数据组装成一个二维数组用DB Tools Insert Data函数一次写入或者拼成一条包含多个VALUES的INSERT语句。我实测下来批量写入比单条循环快一个数量级都不止。数据量大的项目这个差异直接决定程序能不能跑在实时性要求内。6.4 主键和索引别省做测试数据表的时候我习惯加自增主键并且给查询频繁的时间字段建索引。这个习惯一开始看不出来效果等表里攒了几十万条记录再查询有索引和没索引完全是两种体验。别等数据量大了才回头补到时候迁移和重建的活儿更痛苦。测试数据表看着简单但它是整个系统里写入频率最高的表设计时多花十分钟运行阶段能少加一个月班。6.5 密码不要写死在框图里不管是用DSN还是连接字符串账号密码这种敏感信息尽量不要直接写在程序框图上。发布程序时密码写死在框图里等于把钥匙挂在门上。我的做法是写一个配置文件程序启动时读取并拼接连接字符串。这样换了数据库密码只需要改配置文件不用改程序重新编译。这个习惯对长期维护帮助很大尤其是项目转交给别人维护的时候对方不用为了一个密码来回找你。这套链路搭好之后我自己是把“先打通数据库再写界面”当成固定顺序执行的。新项目的第一步永远是先把最小链路验证一遍而不是对着空程序框图发呆。这个习惯帮我省掉了大量返工也推荐你试试。
阅读完成 · 觉得有帮助?
咨询建站