尚不支持ODBC SQL类型-155

Sam*_*Tew 5 python sql-server pyodbc azure-sql-database

我单击此链接来查询Azure数据库。

import pyodbc
server = 'your_server.database.windows.net'
database = 'your_database'
username = 'your_username'
password = 'your_password'
driver= '{ODBC Driver 13 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';PORT=1433;SERVER='+server+';PORT=1443;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM FinancialRecord where deleted=0")
row = cursor.fetchone()
while row:
    print (str(row[0]) + " " + str(row[1]))
    row = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,它显示错误。

追溯(最近一次调用):文件“ sqltest.py”,行10,行= cursor.fetchone()pyodbc.ProgrammingError :(尚不支持ODBC SQL类型-155。column-index = 2 type =- 155”,“ HY106”)

我是Azure的新手。有人可以帮忙吗?

Est*_*net 8

ODBC SQL 类型 -155 对应于 SQL Server 类型DatetimeOFFSET和 ODBC 类型SQL_SS_TIMESTAMPOFFSET。本文档页面中描述了 ODBC 类型和 SQL Server 类型之间的映射。该错误消息表示 Python ODBC API 当前不支持此 SQL Server 数据类型。

要解决此问题,您需要更改查询以避免查询具有DatetimeOFFSET数据类型的列。一种方法是确定FinancialRecord表中具有DatetimeOFFSET数据类型的列并将它们转换为nvarchar(100)类型。

SELECT CAST(MyColumn as AS nvarchar(100)) AS MyColumnAsNVarChar', ...
FROM FinancialRecord where deleted=0
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 8

pyodbc支持Output Converter函数,当数据库返回pyodbc本机不支持的SQL类型时,可以使用它们。上面链接的Wiki页面上的示例将执行客户端转换,类似于将CAST转换为服务器上的[N] VARCHAR的过程:

import struct
import pyodbc
conn = pyodbc.connect("DSN=myDb")


def handle_datetimeoffset(dto_value):
    # ref: https://github.com/mkleehammer/pyodbc/issues/134#issuecomment-281739794
    tup = struct.unpack("<6hI2h", dto_value)  # e.g., (2017, 3, 16, 10, 35, 18, 0, -6, 0)
    tweaked = [tup[i] // 100 if i == 6 else tup[i] for i in range(len(tup))]
    return "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}.{:07d} {:+03d}:{:02d}".format(*tweaked)


crsr = conn.cursor()
# create test data
crsr.execute("CREATE TABLE #dto_test (id INT PRIMARY KEY, dto_col DATETIMEOFFSET)")
crsr.execute("INSERT INTO #dto_test (id, dto_col) VALUES (1, '2017-03-16 10:35:18 -06:00')")

conn.add_output_converter(-155, handle_datetimeoffset)
value = crsr.execute("SELECT dto_col FROM #dto_test WHERE id=1").fetchval()
print(value)

crsr.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)

哪个打印

2017-03-16 10:35:18.0000000 -06:00
Run Code Online (Sandbox Code Playgroud)