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

Python循环处理用户输入插入SQL Server时遇pyodbc.Row类型错误

解决pyodbc.Row类型转换错误及代码修正

你的错误根源是循环逻辑和代码缩进问题,而非单纯的类型转换:

  • active是包含多个pyodbc.Row对象的列表,你写active[1]、active[2]时,取的是整个列表里固定位置的Row对象,不是当前循环的员工数据
  • 循环内的代码没有缩进,导致逻辑完全混乱,触发了类型错误

修正后的完整代码

# 获取在职员工列表
active = list(c.execute("SELECT hrm_id, name, wage FROM employees WHERE active=1;"))

payroll_date = input("Add the date of the payroll: ")

# 直接遍历每个员工的Row对象
for row in active:
    # 打印当前员工姓名
    print(row[1])
    # 输入工作天数
    days_worked = float(input("Type days worked: "))
    # 从当前Row中提取薪资(pyodbc.Row会自动映射对应类型,无需强制转换)
    wage = row[2]
    hrm_id = row[0]
    # 计算应发薪资
    amount_owed = days_worked * wage

    # 插入薪资记录
    sql = "INSERT INTO dbo.payroll(hrm_id, days_worked, amt_owed, payroll_date) VALUES(?, ?, ?, ?)"
    data = [hrm_id, days_worked, amount_owed, payroll_date]
    c.execute(sql, data)

# 所有员工数据处理完后统一提交(也可以在循环内每次提交)
c.commit()

关键修正点说明

  1. 循环方式优化:用for row in active直接遍历每个员工的Row对象,无需通过索引间接获取
  2. 正确提取字段:每个row就是当前员工的记录,row[0]对应hrm_id,row[1]对应name,row[2]对应wage;pyodbc会自动将SQL Server的字段类型转换为Python对应类型(比如数值型直接转int/float),不需要额外用float()/int()强制转换
  3. 修复代码缩进:循环内的代码必须缩进,否则Python会认为这些代码不属于循环体,逻辑完全错误
  4. 提交时机调整:把commit()放在循环外,所有员工数据插入完成后一次性提交,效率更高;如果需要实时保存,也可以放在循环内

额外注意事项

  • 确保输入的payroll_date格式符合SQL Server的日期要求(比如YYYY-MM-DD),否则会插入失败
  • 如果员工数量较多,建议添加异常捕获(比如try-except),避免单个员工输入错误导致整个程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:23