PyODBC 是连接 SQL Server 最稳妥的选择,因其稳定支持 Windows 身份验证及新特性,而 pymssql 已进入维护模式;需正确配置连接字符串、线程隔离、Treeview 动态列定义和参数化查询。
Tkinter 本身不处理数据库连接,真正干活的是 pyodbc。用它连 SQL Server 最稳定,Windows 上默认支持 Windows 身份验证,Linux/macOS 需装 unixodbc 和 Microsoft ODBC 驱动。别用 pymssql —— 它对 Azure AD 认证、Always Encrypted 等新特性支持弱,且已进入维护模式。
安装命令:
pip install pyodbc
DRIVER、SERVER、DATABASE;Windows 身份验证加 Trusted_Connection=yes
UID 和 PWD,密码含特殊字符需 URL 编码(比如 @ → %40)IM002: [Microsoft][ODBC Driver Manager] Data source name not found,说明驱动没装或名字写错了——运行 pyodbc.drivers() 查看可用驱动名直接在按钮回调里调用 cursor.execute() 会卡死整个窗口,尤其查大数据量时。必须用 threading.Thread 或 after() 拆离主线程,但 pyodbc.Connection 不是线程安全的,不能跨线程复用连接对象。
conn.close(),别试图“池化”或全局复用 Connection
cursor.fetchall() 拿完再关连接;若数据超 10 万行,改用 fetchmany(1000) 分批读,避免内存爆掉pyodbc.Error,不是 Exception,否则 SQL 错误码(如 18456 登录失败)会被吞掉ttk.Treeview 显示查询结果很常见,但直接塞 fetchall() 返回的 tuple 列表会出错:列数不匹配、中文乱码、数字右对齐缺失。
立即学习“Python免费学习笔记(深入)”;
cursor.description 动态生成 Treeview["columns"] 和表头,别硬编码列名tree["show"] = "headings",否则首列显示空编号tree.column("col_name", anchor="e") 右对齐;中文列宽至少设 width=120,否则截断None,Treeview 会显示为空白字符串,无需额外替换用户在 Entry 里输 “O’Malley”,拼字符串进 SQL 就会崩。Tkinter 没自带参数绑定机制,全靠 pyodbc 的 ? 占位符。
WHERE name = ?,执行时传元组:cursor.execute(sql, (entry.get(),))
pyodbc 不支持命名参数)datetime.date 对象,别传字符串;布尔字段传 True/False,不是 "1" 或 "true"
entry.get() 返回空字符串,直接传进去就行,pyodbc 会当 NULL 处理