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
相关产品推荐
相关产品推荐

