Intouch访问SQL Access数据库:ODBC配置、绑定列表与踩坑实战
发布时间:2026/9/25 10:14:09 作者:尧图编辑部 阅读量:1,286

简介面向需要打通工业自动化软件与Access数据库联动的工程师这份PDF系统介绍了Intouch访问SQL Access数据库的完整实现路径。文档从ODBC数据源配置、SQL Access Manager安装、绑定表与表模板创建到标记名定义、脚本编程与最终测试均有涉及同时解释了数据库、表、绑定表、表模板、数据源、ODBC等关键术语并以Microsoft Access 2000 ODBC为示例说明如何建立数据源名称DSN、创建绑定表实现InTouch标记与数据库字段的一一映射以及脚本编写和测试验证的关键思路便于读者理解从Access建表到Intouch实时读写数据的全过程。压缩包内仅含1个PDF文件约919KB内容紧凑、步骤完整适合在工业自动化项目实施或现场调试时对照查阅。目前已有202人学习下载文档按阅读前提、专业术语、配置、创建应用、测试和总结的顺序组织可快速定位所需章节。1. Intouch访问SQLAccess数据库这事到底卡在哪在一线工控现场“Intouch访问SQLAccess数据库”这个PDF标题翻译过来就是一件很具体的事让Wonderware现在是AVEVA的InTouch画面把标签变量写进Access数据库表或者反过来从Access表里查数据刷新画面。SQL Access是这套组态软件自带的SQL访问管理器它不是一个数据库产品而是一层介于InTouch标签库和外部关系数据库之间的“翻译层”。干过老项目的人都知道真正让你头疼的不是不会写SQL而是ODBC驱动版本不对、绑定列表报错、Access文件被锁死这类跟“数据库本身”没关系的问题。这篇笔记就按我自己的落地路径从链路、配置步骤到五个踩坑点完整过一遍。2. 先把SQL Access的工作链路拆开它不是数据库是“翻译层”2.1 SQL Access Manager在整套系统里到底扮演什么角色常见的一个误解是装了SQL Access就能直接操作Access数据库了。实际上SQL Access Manager只是中间层真正的数据流是InTouch QuickScript调用SQL函数 → SQL Access Manager读取绑定列表Binding List → ODBC数据源DSN → Microsoft Access数据库文件也就是说InTouch画面里按钮或定时脚本执行一段QuickScript脚本里的SQLConnect、SQLInsert、SQLSelect这类函数把请求发给SQL Access ManagerSQL Access Manager再依据你预先配好的“绑定列表”把InTouch标签和Access表的字段一一对应起来最后通过ODBC驱动真正读写那个.accdb或.mdb文件。把这条链路记住后面排错时就有了检查顺序脚本里函数写法是否有误 → 绑定列表是否建立 → ODBC DSN是否指向正确的Access文件 → Access文件本身是否损坏或被占用。大多数“连接失败”的报错问题都出在这四层的中间两层。绑定列表是这个方案里最容易被忽略的设计。绑定列表做的是一对一的字段映射例如InTouch里的离散标签Equipment_1_State绑定Access表的equip_state短整型字段内存实型标签Flow_Setpoint绑定flow_sp双精度字段。SQL Access会把标签的数据类型翻译成Access能理解的类型这一层的存在让你在脚本里不用逐字段手工拼SQL值列表数据量大时效率高很多。2.2 选Access还是选SQL Server现场环境说了算很多教程直接把Access当成默认的唯一选择实际上在访问SQL Access数据库这个方向里SQL Server同样是SQL Access Manager的原生支持对象。我的习惯是按下表判断对比项Access (.mdb/.accdb)SQL Server / SQL Express部署难度单文件拷贝即用需要安装服务、配置登录账号适用工程规模单机或少量客户端、低频写入多点并发、高持续写入、需要服务端稳定运行并发能力较弱多人同时写容易锁库服务端统一管理并发锁问题少很多典型场景配方下发、交接班记录、日报表历史趋势归档、多站点数据汇总维护成本Access文件会膨胀需定期压缩备份维护走SQL Server惯例如果你负责的现场只有一台操作员站一天写入几百条记录Access完全可以扛住如果现场是三台InTouch客户端从不同工位写同一个数据库我会优先建议用SQL Express而不是尝试去调Access的共享参数——Access的锁机制在工控这种持续写入场景下会让你很被动。2.3 安装32位Access驱动64位系统上最常见的环境坎这一节还要提一下环境准备。现在的工控机清一色64位Windows系统但你打开Windows的ODBC管理器往往只看到64位驱动在数据源列表里找不到Microsoft Access Driver。原因是InTouch本身的进程是32位它只能加载32位ODBC驱动而64位系统默认的odbcad32.exe对应的是64位管理器。解决方式是用SysWOW64目录下的ODBC管理器去添加驱动路径是C:\Windows\SysWOW64\odbcad32.exe在这个管理器里选择“Microsoft Access Driver (*.mdb, *.accdb)”具体名称随Access Database Engine版本略有差异然后配置系统DSN或用户DSN指向你要操作的Access文件。这里有个经验在Intouch里调用SQL函数时填的是数据源名称DSN不是数据库物理路径所以DSN配置完成后路径不能随便移动否则系统找不到文件。提示如果连接时提示找不到驱动检查是否安装了Microsoft Access Database Engine 2010 Redistributable的32位版本。注意Access驱动分32位和64位两个安装包装了64位驱动Intouch照样用不上。3. 用最小可运行方案实现Intouch读写Access从建表到画面按钮3.1 第一步在Access里把表结构建好字段类型尽量贴近InTouch标签一个可落地的做法是先建Access文件把业务表结构列出来。以“操作员交接班记录”为例在Access里新建数据库PlantLog.accdb用查询设计器或直接执行SQL语句建立一张ShiftLog表CREATE TABLE ShiftLog ( RecordID AUTOINCREMENT PRIMARY KEY, ShiftDate DATETIME, OperatorName VARCHAR(50), LineNo INTEGER, ProductCount DOUBLE, Remark MEMO );这段DDL说明RecordID做主键用AUTOINCREMENT避免插入数据时需要手工维护唯一编号ShiftDate用DATETIME保存交接班时间OperatorName这类文本用VARCHAR(50)LineNo用整数类型ProductCount如果来自InTouch的实型标签用DOUBLERemark用MEMO长度不固定可以多存几行备注文字。字段类型设计有个原则宁可让数据库字段类型“宽”一点也别让InTouch标签去迁就数据库。比如InTouch的实型标签写入DOUBLE没有任何问题反过来如果数据库字段是INTEGER而画面标签是实型写入时遇到小数就会报错或丢失精度。3.2 第二步配置ODBC数据源务必检查系统DSN和驱动态库建好表之后打开C:\Windows\SysWOW64\odbcad32.exe如果你确认InTouch是64位版本则用系统自带的64位管理器但绝大多数场景是32位。配置要点如下点击“添加”选择Microsoft Access Driver (*.mdb, *.accdb)数据源名称命名为PlantLogDSN注意不要用中文或特殊符号否则QuickScript调用时可能出现编码或解析异常在“数据库”段点“选择”指向PlantLog.accdb文件测试连接如果能打开说明DSN配置正常。这个DSN在目标机器上必须存在因为InTouch画面运行时是在客户端机器上解析这个数据源名称的。你在一台开发机上配好不代表操作员站上就能直接跑发布工程时需要在每台运行InTouch的机器上都配置DSN。3.3 第三步在SQL Access Manager里创建Table和绑定列表进WindowMaker找到“Specialty”菜单下的SQL Access Manager。打开后先创建Table定义表名ShiftLogDSNPlantLogDSN表类型选择“存在的表”Existing Table即使用前面在Access里建好的表创建好Table之后针对ShiftLog表建立Binding List。绑定列表的字段对应关系如下InTouch标签名类型绑定到Access字段方向OperatorNameString(50)OperatorName写CurrentLineIntegerLineNo写ProductTotalRealProductCount写ShiftRemarkString(100)Remark写CurrentTimeRealShiftDate写这里有个需要留意的点ShiftDate字段类型是DATETIMEInTouch标签却是实型时间戳直接绑定写入会出问题。常见做法是脚本里先把CurrentTime换算成符合Access DATETIME格式的字符串或者把SQL语句里的INSERT语句改成显式传值。如果不想引入太多细节给ShiftDate建立一个额外的字符串标签来绑定也是现场常见的临时解法。3.4 第四步在QuickScript里写SQLConnect和SQLInsert让画面按钮把记录写进去接下来是在InTouch画面按钮的按钮脚本Button Script里写QuickScript。下面的例子是最小可跑的写入逻辑// 定义局部变量 INT ResultCode; // 建立连接DSN名称与ODBC配置保持一致 ResultCode SQLConnect(ConnectionID, DSNPlantLogDSN); // 判断连接是否成功 IF ResultCode 0 THEN // 把需要插入的记录打包按绑定列表顺序提供标签值 SQLInsert(ConnectionID, ShiftLog, OperatorName,LineNo,ProductCount,Remark, OperatorName,CurrentLine,ProductTotal,ShiftRemark); // 断开连接释放资源 SQLDisconnect(ConnectionID); ELSE // 连接失败把错误代码显示在画面上 ShowResult ResultCode; ENDIF;这段脚本的逻辑并不复杂SQLConnect建立InTouch程序和ODBC数据源之间的连接第一个参数ConnectionID是输出参数连接成功后会被赋一个句柄值第二个参数传入连接串。连接成功之后SQLInsert最核心的三个参数分别是连接ID、目标表名、Access字段列表以及InTouch标签列表。字段列表和标签列表是一一对应的顺序不能乱。参数说明SQLConnect返回0表示成功非0值对应不同的错误类别建议在脚本里把它显示到画面上方便定位是DSN找不到还是Access文件路径无效。另外在定时脚本里执行写入时连接创建后一定要在写入完成后SQLDisconnect不然连接句柄会越积越多最后导致数据库无法访问。读操作同样套路先SQLSelect查询再用SQLGetResult取结果SQLConnect(ConnectionID, DSNPlantLogDSN); // 查询参数用?占位防止字符串拼接出错 SQLSelect(ConnectionID, SELECT OperatorName, ProductCount FROM ShiftLog WHERE OperatorName ?, OperatorName, 1); // 把查询结果取到标签里 SQLGetResult(ConnectionID, OperatorName); SQLGetResult(ConnectionID, ProductTotal); SQLDisconnect(ConnectionID);SQLSelect的最后一个参数代表最大返回记录数设置为1时只取第一条记录。这里需要注意如果查询结果多于返回数要多用SQLGetResult按字段顺序逐个取取完后用SQLGetLast等函数判断是否还有剩余记录否则会出现“结果未取完”的运行时告警。4. Intouch访问SQL Access的避坑清单五个血泪经验4.1 连不上数据库报错提示驱动问题但ODBC管理器里明明有驱动现象Intouch运行时记录器报“Driver not found”或者“Data source name not found and no default driver specified”但打开ODBC管理器看驱动和数据源都在。原因之前提到的32位/64位驱动版本错位。Intouch进程是32位ODBC管理器若打开的是64位版本配置的DSN和驱动对32位进程不可见。另一个常见原因是机器上装了两个版本的Access驱动ODBC管理器里看起来有多个可用驱动但DSN绑定到了不被当前进程支持的驱动上。解决确认只安装32位Microsoft Access Database Engine从C:\Windows\SysWOW64\odbcad32.exe进入删掉原有DSN重新添加名字尽量用PlantLogDSN这样的纯英文名称。如果安装有Access 2010 Redistributable即“ACE驱动”不要同时装64位版本否则DSN列表会出现混乱。4.2 写入时报类型不匹配实型标签写入INTEGER字段失败现象SQLInsert执行后Intouch系统变量中返回非零值记录日志提示“Type mismatch in expression”画面上数据没写进去。原因数据库字段是INTEGER或LONGInTouch标签是实型数值带小数Access驱动在转换时无法把带小数的实数放进整数列直接报错。反过来的情况也存在标签是整数数据库字段是文本通常能写成功但查询时排序和统计会出现意外。解决建表时让数据库字段类型与标签类型严格对应无法完全对应时在QuickScript里先做一次强制类型转换再写入。例如实型标签ProductTotal要写入INTEGER字段先赋值给一个整型中间标签再执行SQLInsert。4.3 多次写入后Access文件越来越大甚至损坏现象数据库在持续运行一段时间后文件体积从几十MB膨胀到几百MB偶尔出现“不可识别的数据库格式”错误。原因Access数据库本身有文件膨胀问题删除记录时并不自动回收空间非正常断电或进程中途退出导致的页面损坏也会加大文件体积。工控现场最常见的诱因是操作员直接关掉画面程序而不是通过InTouch正常退出导致SQL连接没有释放Access的日志文件来不及清理。解决定期压缩数据库是必要手段。压缩时先停掉所有InTouch的SQL写入用Access或脚本执行压缩命令。另外写入完成后务必在脚本里执行SQLDisconnect并用系统函数检查操作是否成功后再断开。若一个画面同时存在多个写入入口最好统一管理连接ID避免每写一条记录就新建一个连接。4.4 查询语句报错SQL语法明明没问题Access就是不认现象代码里写SELECT * FROM ShiftLog WHERE LineNo 10 AND Level 2结果在SQL Access里返回错误提示语法错误但同样的语句在Access查询窗口能跑通。原因Access数据库的关键字和ODBC SQL语法之间有一定差异。Level、Date、Even、Remark这类词在部分Access版本中属于保留字或函数名直接放在字段的位置会被解析器误解。另一个常见现象是建表字段时用了中文名称或者带空格查询时必须写[字段名]才能通过。解决查询语句里的字段和表名统一不用保留字。已经用保留字建了字段时把查询里的字段名用方括号包起来例如SELECT [Level] , [OperatorName] FROM ShiftLog。用绑定列表取数时Binding List里的字段名也要跟Access里的实际名字完全一致大小写不敏感但拼写必须一致。4.5 操作员站断电重启Access文件被锁定其他客户端写不进去现象一台InTouch客户端异常退出后其他客户端的SQLInsert开始超时显示“记录锁定”或“无法更新数据库”重启数据库也无济于事。原因Access数据库默认基于文件共享锁定异常退出时Access会在PlantLog.accdb同目录下生成PlantLog.ldb或.laccdb锁文件。如果断开不及时锁文件不会自动消失其他客户端就认为数据库仍被占用。解决一般来说重启所有客户端进程后锁文件会自动清理。若仍存在进入Access文件所在目录检查.ldb文件的修改时间确认没有进程占用该Access文件后删除锁文件。为了避免后续反复出现我在多客户端场景里一般不直接让多个InTouch同时写同一个Access文件而是让其中一台机器做“数据库写代理”其余机器只把数据转给它由它统一写库。5. 进阶把Access迁到SQL Server时SQL Access配置要改哪几处工程到最后往往要应付更大的数据量把Sql Access的存储后端从Access改成SQL Server是很多老项目走上正轨前要做的一步。迁移过程中并不需要重新学一套逻辑SQL Access Manager的机制没变你只需要改四个方面。一是ODBC DSN换成SQL Server Native Client驱动新建DSN类型改成SQL Server或SQL Server Native Client 11.0填写服务器IP、登录账号和数据库名。二是SQL Access Manager里的Table定义要重新指向新DSN关联的Access表名改成SQL Server的表名绑定列表可以原样保留字段名只要在SQL Server里存在即可继续使用。三是QuickScript连接串全都要改SQLConnect从DSNPlantLogDSN改成DSNPlantLogSqlDSN这类形式连接成功之后脚本逻辑不需要动SQLInsert的字段列表和标签列表与数据库引擎无关。四是数据库类型转换验证这是最容易忽视的一块。把ShiftLog表原字段在SQL Server里建好后字段类型要按SQL Server规范调整。AUTOINCREMENT换成IDENTITY(1,1)MEMO换成NVARCHAR(MAX)DATETIME保持不变其余文本和数字类型基本可以直迁。建议迁移后在InTouch画面做一个测试按钮执行一条带时间条件的SELECT COUNT(*)查询确认取回来的记录数与Access里的历史数据一致。给查询加时间筛选也是SQL Server模式下常用的一个技巧写法如下SELECT OperatorName, ProductCount FROM ShiftLog WHERE ShiftDate 2025-01-01 00:00:00 ORDER BY ShiftDate DESC;这段查询放在SQLSelect里配合SQLGetResult逐条读取就能实现日报表按班次拉取最近记录。对比在Access里写同样逻辑SQL Server在大量历史数据下的响应速度快得多也不再需要定期压缩数据库。回到开头那个PDF标题Intouch访问SQLAccess数据库的实现说到底就这三步把ODBC链路配对把绑定列表填对把脚本里的连接管理做好。我这几年被坑得最多的还是64位驱动和锁文件这两件事现在每接手一个老项目第一件事就是去检查SysWOW64里的ODBC配置而不是直接打开画面点按钮。希望这篇笔记能让你少走这段弯路。本文还有配套的精品资源点击获取