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

Python遍历查询结果更新SQL Server表出现数据类型报错如何解决?

问题排查与修复方案

核心问题定位

你遇到的两个核心问题分别对应遍历失效和数据类型报错:

  • 结果集仅能遍历一次:如果results是数据库查询返回的游标迭代对象,第一次遍历打印row[0]后,游标已经移动到结果集末尾,第二次遍历for row in results时没有剩余数据可处理,这是只有第一行能正常执行的直接原因。
  • SQL参数类型不匹配:你给UPDATE语句的第二个参数传的是bill,而bill = row,row是结果集返回的元组对象,不是FullPath字段需要的路径字符串。ODBC驱动无法将元组转换为SQL支持的字符串类型,就会抛出Invalid SQL data type报错。
  • 额外冗余问题:你把数据库连接创建、关闭的逻辑写在了循环内部,每次循环都会重复创建销毁连接,会产生不必要的性能损耗。

修复步骤

  1. 执行查询后先把结果集转为列表固化内容,避免遍历一次就失效:results = list(results)
  2. 给SQL的WHERE条件传入路径字符串row[0],不要传入整个row元组
  3. 将数据库连接、游标创建逻辑移到循环外层,避免重复创建连接
  4. 读文件时指定编码,避免不同系统环境下的文件读取编码报错

修复后代码示例

import pyodbc

# 固化结果集,支持多次遍历
results = list(results)

# 提前打印所有路径确认
for row in results:
    print(row[0])

# 全局创建一次数据库连接和游标,无需循环内重复创建
cnxn1 = pyodbc.connect('Driver={SQL Server};'
                       'Server=XXX;'
                       'Database=00010KData;'
                       'Trusted_Connection=yes;')
curs1 = cnxn1.cursor()

for row in results:
    file_path = row[0]
    # 读文件时指定编码,可根据你的文件实际编码调整为gbk等
    with open(file_path,'r', encoding='utf-8', errors='ignore') as f:
        contents = f.read()
        VanHalen = 'Hello'
        # 第二个参数传路径字符串,而非整个row元组
        curs1.execute('''
                    Update EdgarComments SET Comments7 = ? WHERE FullPath = ?
                    ''', (VanHalen, file_path))
        print(f"已更新路径:{file_path}")

# 统一提交事务、关闭资源
cnxn1.commit()
curs1.close()
cnxn1.close()

如果你的业务逻辑要求每个路径要执行3次更新操作,只需要把对应的for x in range(0,3)逻辑嵌套在每个文件的处理逻辑内部即可,不要将数据库连接的创建逻辑放到循环里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:45:01