跨网络使用Python连接云主机Tally ODBC报错问题咨询
跨外网连接云服务器Tally ODBC服务故障排查
问题背景
Tally部署在云服务器上,已完成客户端IP白名单配置、服务端9000端口开放,外网客户端使用如下Python代码发起连接:
import pyodbc conn = pyodbc.connect('Dsn=TallyODBC64_9000;Driver={Tally ODBC Driver};server=20.xx.xx.xx;port=9000')
代码运行抛出错误:
InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
待确认问题:
- 本地客户端是否需要安装Tally ODBC驱动
- 现有连接配置的排查路径
解答
1. 本地客户端必须安装Tally ODBC驱动
ODBC是客户端侧的驱动层中间件,你现在拿到的IM002错误本身就说明本地ODBC驱动管理器找不到连接串指定的驱动和DSN,这一步和服务端配置没有关系。
Tally ODBC驱动不会随pyodbc预装,也不是主流操作系统自带组件,必须在发起连接的本地设备上安装。注意安装的驱动架构(32位/64位)必须和你本地使用的Python环境、pyodbc版本架构完全匹配,否则就算装了也识别不到。
2. 按以下优先级排查配置问题
- 校验本地驱动注册状态
打开本地ODBC数据源管理器:64位Python环境运行64位版odbcad32.exe,32位Python环境运行SysWOW64目录下的32位版odbcad32.exe,切换到「驱动」标签页,确认列表中存在Tally ODBC驱动,准确记录驱动的完整显示名称。大部分同类报错都是因为连接串里写的{Tally ODBC Driver}和系统实际注册的驱动名不匹配——比如实际名称可能是TallyODBC64_9000、带版本后缀的Tally ODBC Driver 9.0等,连接串里的驱动名必须和注册名完全一致,不能自行臆测填写。 - 修正连接串写法
如果你没有提前在ODBC管理器中手动创建名为TallyODBC64_9000的用户/系统DSN,就不要在连接串里加Dsn参数,否则ODBC管理器会优先查找对应名称的DSN,找不到就直接抛错。无DSN的连接串参考格式:
如果要使用DSN模式连接,必须先在ODBC管理器中新建对应名称的DSN,提前填好服务端IP、端口参数后再在代码里调用。# 大括号内的驱动名替换成你在ODBC管理器里查到的准确名称 conn = pyodbc.connect('Driver={TallyODBC64_9000};Server=20.xx.xx.xx;Port=9000;') - 验证服务端监听配置
本地先执行telnet 20.xx.xx.xx 9000确认端口连通性。注意除了云平台安全组、服务器系统防火墙(Windows防火墙/iptables/firewalld)要放通9000端口入站规则外,还要检查Tally自身的配置:默认安装后Tally的ODBC服务只绑定127.0.0.1本地回环地址,必须手动把监听地址改成0.0.0.0,否则就算端口开放,外网流量也无法被Tally服务接收。 - 校验版本匹配
本地安装的Tally ODBC驱动大版本必须和云服务器上部署的Tally服务版本一致,跨大版本的驱动存在协议兼容问题,会导致连接失败。
内容的提问来源于stack exchange,提问作者Shubham Khandelwal
相关产品推荐
相关产品推荐

