sql-server 查询SQL数据库行时出现Python和Win32com模块问题

wi3ka0sx  于 2022-10-31  发布在  Python
关注(0)|答案(2)|浏览(130)

我的目标是使用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没有属性的异常。在网上看,关于这个问题的信息很少。请你告诉我为什么代码不能显示所有的行结果?理想的情况下,我希望列名也能显示出来。

shstlldc

shstlldc1#

假设您的COM对象与ADODB对象对齐,GetRows会执行下列动作:
将Recordset对象的多条记录检索到数组中。
在Python中,这个数组或多维对象被转换为一个嵌套的元组,而没有像列名这样的元数据:

rst.MoveFirst()
res = rst.GetRows()   # TUPLE OF TUPLES

# LOOP THROUGH ROWS

for i in range(len(res)):
    # LOOP THROUGH COLUMNS
    for j in range(len(res[i])):        
        print(res[i][j])

ADODB示例:

import win32com.client

# OPEN SQL SERVER DATABASE CONNECTION

conn = win32com.client.gencache.EnsureDispatch("ADODB.Connection")
conn.Open(
    "Driver={ODBC Driver 17 for SQL Server};"
    f"Server=myServer;Database=myDatabase;"
    "Trusted_Connection=Yes;"
)

# OPEN RECORDSET

rst = win32com.client.gencache.EnsureDispatch("ADODB.Recordset")
rst.Open("SELECT * FROM myTable", conn)

rst.MoveFirst()
res = rst.GetRows()

# LOOP THROUGH ROWS

for i in range(len(res)):
    # LOOP THROUGH COLUMNS
    for j in range(len(res[i])):        
        print(res[i][j])

# CLOSE AND RELEASE OBJECTS

rst.Close(); conn.Close()
rst = None; conn = None
del rst; del conn
hs1ihplo

hs1ihplo2#

简单的答案是我手动添加每一列以创建完整的行输出,如下所示:

col1 = dbq1.Fields("ID").Value
col2 = dbq1.Fields("Name").Value
col3 = dbq1.Fields("Login").Value
col4 = dbq1.Fields("Email").Value
print(str(col1) + " " + str(col2) + " " str(col3) + " " str(col4))

相关问题