我的目标是使用Win32com模块通过Python控制台显示SQL查询。我能够使用comobject访问并成功显示SQL查询的字段,但是当我试图显示行时,我会遇到异常。
背景
我用过PYODBC,它工作得很好,但是有一个限制,基于什么SQL提供程序被安装和TLS 1.2是否被强制执行。该软件有时被安装到一个外部SQL服务器,因此在软件的服务器上没有提供程序可以总是建立连接。这就是为什么我现在使用软件的内核通过com对象来访问数据库,因为这规避了需要安装或最新Windows的提供程序的陷阱更新以允许TLS 1.2连接等
适用于我的使用字段的Win32com代码
import win32com.client
import win32com
"""Connection"""
objprox = win32com.client.Dispatch("****.DbObjectProxy") #Blanked out for security of Software
"""Set Query"""
sql1 = "select * from ServiceConsumer_t"
dbq1 = objprox.DoDatabaseQuery(sql1)
dbq1.Open(sql1)
"""Specify & Print result"""
while not dbq1.EOF:
col1 = dbq1.Fields("ID").Value
dbq1.MoveNext()
print(col1)
"""Close Session"""
dbq1.Close()
上面的输出为:
{9CAFD41E-D322-4234-BF80-CF6E11A724A0}
{CE4AAE72-0889-41E8-BDB2-ED96696DDB91}
{DC18008F-2C84-4EB4-BCCB-D94FF96E0564}
{1AAB143C-8393-4C1E-BE94-7AB44788D4E4}
这是正确的,因为我指定了要输出的ID列,并使用MoveNext()
进行迭代。这表明我接近了我的目标,但是,下面显示行的代码似乎从来没有工作过,我现在不知道为什么?
无法显示行的Win32com代码:
import win32com.client
import win32com
"""Connection"""
objprox = win32com.client.Dispatch("*****.DbObjectProxy") #Blanked out for security of Software
"""Set Query"""
sql2 = "select * from ServiceConsumer_t"
dbq2 = objprox.DoDatabaseQuery(sql2)
dbq2.Open(sql2)
"""Specify & Print result"""
while not dbq2.EOF:
dbq2.MoveFirst()
res = dbq2.GetRows()
dbq2.MoveNext()
print(res)
"""Close Session"""
dbq2.Close()
从这里,我只得到了对象GetRows
没有属性的异常。在网上看,关于这个问题的信息很少。请你告诉我为什么代码不能显示所有的行结果?理想的情况下,我希望列名也能显示出来。
2条答案
按热度按时间shstlldc1#
假设您的COM对象与ADODB对象对齐,
GetRows
会执行下列动作:将Recordset对象的多条记录检索到数组中。
在Python中,这个数组或多维对象被转换为一个嵌套的元组,而没有像列名这样的元数据:
ADODB示例:
hs1ihplo2#
简单的答案是我手动添加每一列以创建完整的行输出,如下所示: