You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pyodbc写入SQL Server int正常 varchar/字符串插入报错

问题根因

报错核心是SQL拼接逻辑的问题:

  • 传入int类型数值时,拼接出来的SQL片段是VALUES(25, ...),SQL引擎可以正常识别为数字常量,执行不会出错
  • 传入字符串比如asdf时,拼接出来的SQL片段是VALUES(asdf, ...),SQL Server会把没有单引号包裹的字符序列判定为列名,自然会抛出「无效列名 'asdf'」的错误
  • 这种直接拼接用户输入生成SQL的写法本身还有SQL注入风险,属于必须规避的写法
修复方案

直接用pyodbc支持的参数化查询即可,不需要手动拼接SQL字符串,驱动会自动处理不同类型值的引号包裹、特殊字符转义,既解决当前报错,也能避免注入风险。

修正后的核心代码:

value1 = DENSITY_VALUE.get()
value2 = DATE_1.get()
value3 = TIME_1.get()
value4 = CHART_VALUE.get()

# 如果数据库对应字段是数值、日期时间类型,提前做类型转换即可,例如:
# value1 = float(value1)
# value2 = datetime.datetime.strptime(value2, "%Y-%m-%d").date()

# pyodbc用?作为参数占位符,按顺序传入参数即可
cursor.execute(
    "INSERT INTO TEST_DISA_MAIN_TABLE(DENSITY_VALUE, DATE_1, TIME_1, CHART_VALUE) VALUES (?, ?, ?, ?)",
    value1, value2, value3, value4
)

conn.commit()
conn.close()

# 清空输入框
DENSITY_VALUE.delete(0, END)
DATE_1.delete(0, END)
TIME_1.delete(0, END)
CHART_VALUE.delete(0, END)
避坑提醒

不要尝试手动给字符串加单引号的方式修复(比如把拼接逻辑改成VALUES('"+value1+"', ...)),这种写法遇到输入内容本身带单引号(比如输入O'Neil)时会直接语法报错,完全没有鲁棒性,参数化查询是唯一正确的方案。

内容的提问来源于stack exchange,提问作者ABCDave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:03:19