列、参数或变量 #5:找不到数据类型

Column, parameter, or variable #5: Cannot find data type

这是一个脚本,用于通过文件哈希分析文件的信誉。文件哈希取自 Azure SQL 数据库并通过调用 API 进行分析,并将结果再次输入数据库。我正在为 SQL 服务器使用 ODBC 驱动程序 17。

我在将数据重新输入数据库时​​遇到错误。


# Scanning files
def fileScan():

    select_sql = "SELECT source_hash FROM [Downloads]"
    crsr.execute(select_sql)

    rows = crsr.fetchall()

            
    # Read all rows
    for row in rows:
        print(''.join(row))
        response = vt.get_file_report(''.join(row))
        time.sleep(15)


        source_hash = row
        md5 = json.dumps(response['results']['md5'])
        sha1 = json.dumps(response['results']['sha1'])
        sha256 = json.dumps(response['results']['sha256'])
        detections = json.dumps(response['results']['positives'])
  

        query = (
            "UPDATE Downloads SET md5=(?), sha1=(?), sha256=(?), detections=(?)"
            "WHERE source_hash=(?)")
       

        crsr.execute(query, (md5,sha1,sha256,detections,source_hash))

        crsr.commit()

下面是错误。

461a26ad4219ea5e504fcdd1a61beb80b1a7fba8ff760e6696aa8cc3a3937887是从数据库中取出来分析的hash值。

数据库中source_hash的数据类型为VARCHAR(1024)。

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]
Column, parameter, or variable #5: Cannot find data type 461a26ad4219ea5e504fcdd1a61beb80b1a7fba8ff760e6696aa8cc3a3937887. (2715)
(SQLExecDirectW); [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180);
[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Parameter or variable '@P5' has an invalid data type. (2724)")

虽然很多来源都发布了类似的错误,但没有提到确切的解决方案。

根据显示的错误,

Parameter or variable '@P5' has an invalid data type. (2724)")

source_hash in SQL query (Near to WHERE clause) is expecting something (string or int) but your source_hash variable is not giving the exact data type and in the您使用的代码 ''.join(raw)source_hash = raw。这意味着如果您的代码为该部分编译成功,则原始变量可以是列表或元组。

例如,

..... WHERE source_hash = "452dferasd5481asd5"

这是 SQL 查询所期望的,但是 source_hash 变量可以是列表或元组,

['452dferasd5481asd5','',...] or ('452dferasd5481asd5', '',...)

因此,尝试打印您的 source_hash 变量以检查其数据类型。如果它出现在给定的示例中,您可以使用 source_hash[0] 来获取它。