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

Python结合Win32com模块查询SQL数据库行的异常问题排查

问题分析与解决方案

问题原因

你尝试调用的GetRows是标准ADO Recordset对象的方法,但当前通过DbObjectProxy.DoDatabaseQuery()返回的查询对象并非标准ADO Recordset,而是软件自定义的数据库查询对象,因此不支持GetRows方法,触发"对象无GetRows属性"的异常。此外,你的错误代码中存在逻辑问题:循环内调用MoveFirst()会导致每次都回到结果集第一行,永远无法遍历完所有数据。

解决方案

既然该对象支持Fields属性(你已成功通过Fields("ID").Value获取字段值),我们可以通过遍历Fields集合来获取整行数据及列名,具体步骤如下:

  1. 先获取所有列名,通过遍历Fields集合的Name属性;
  2. 逐行遍历结果集,对每行遍历所有字段,关联列名与对应值;
  3. 格式化输出每行数据(可选择字典、表格等形式)。

修正后的代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:20:17