Python结合Win32com模块查询SQL数据库行的异常问题排查
问题分析与解决方案
问题原因
你尝试调用的GetRows是标准ADO Recordset对象的方法,但当前通过DbObjectProxy.DoDatabaseQuery()返回的查询对象并非标准ADO Recordset,而是软件自定义的数据库查询对象,因此不支持GetRows方法,触发"对象无GetRows属性"的异常。此外,你的错误代码中存在逻辑问题:循环内调用MoveFirst()会导致每次都回到结果集第一行,永远无法遍历完所有数据。
解决方案
既然该对象支持Fields属性(你已成功通过Fields("ID").Value获取字段值),我们可以通过遍历Fields集合来获取整行数据及列名,具体步骤如下:
- 先获取所有列名,通过遍历
Fields集合的Name属性; - 逐行遍历结果集,对每行遍历所有字段,关联列名与对应值;
- 格式化输出每行数据(可选择字典、表格等形式)。
修正后的代码示例
import win32com.client # 连接数据库 objprox = win32com.client.Dispatch("****.DbObjectProxy") # 执行查询 sql = "select * from ServiceConsumer_t" dbq = objprox.DoDatabaseQuery(sql) dbq.Open(sql) # 获取所有列名 column_names = [field.Name for field in dbq.Fields] print("列名:", column_names) # 遍历所有行并输出整行数据 print("\n查询结果:") while not dbq.EOF: # 构建当前行的字典(列名: 值) row_data = {field.Name: field.Value for field in dbq.Fields} # 格式化输出,也可直接打印row_data查看原始结构 print(", ".join([f"{col}={row_data[col]}" for col in column_names])) dbq.MoveNext() # 关闭会话 dbq.Close()
代码说明
- 先通过列表推导式获取所有列名,便于后续关联字段值与列名;
- 每行数据通过字典存储,键为列名,值为对应字段值,既方便查看也便于后续处理;
- 移除了错误的
MoveFirst()调用,确保正常遍历所有行。
额外提示
如果需要将结果转换为更易处理的结构(如pandas DataFrame),可以在遍历行时收集所有行数据,再转换:
import pandas as pd # 收集所有行数据 rows = [] while not dbq.EOF: rows.append({field.Name: field.Value for field in dbq.Fields}) dbq.MoveNext() # 转换为DataFrame df = pd.DataFrame(rows) print(df)
内容的提问来源于stack exchange,提问作者Scr3wball88
相关产品推荐
相关产品推荐

