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()
关键修正点说明
- 循环方式优化:用
for row in active直接遍历每个员工的Row对象,无需通过索引间接获取 - 正确提取字段:每个
row就是当前员工的记录,row[0]对应hrm_id,row[1]对应name,row[2]对应wage;pyodbc会自动将SQL Server的字段类型转换为Python对应类型(比如数值型直接转int/float),不需要额外用float()/int()强制转换 - 修复代码缩进:循环内的代码必须缩进,否则Python会认为这些代码不属于循环体,逻辑完全错误
- 提交时机调整:把
commit()放在循环外,所有员工数据插入完成后一次性提交,效率更高;如果需要实时保存,也可以放在循环内
额外注意事项
- 确保输入的
payroll_date格式符合SQL Server的日期要求(比如YYYY-MM-DD),否则会插入失败 - 如果员工数量较多,建议添加异常捕获(比如
try-except),避免单个员工输入错误导致整个程序崩溃
内容的提问来源于stack exchange,提问作者george99gr
相关产品推荐
相关产品推荐

