Столбец, параметр или переменная #5: Не удается найти тип данных

#python #sql-server #azure-sql-database #pyodbc

Вопрос:

Это скрипт, написанный для анализа репутации файлов по хэшу файла. Хэш файла берется из базы данных SQL Azure и анализируется с помощью вызова API, а результат снова вводится в базу данных. Я использую драйвер ODBC 17 для SQL Server.

Я получаю ошибку при повторном вводе данных в базу данных.

 
# 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-это хэш-значение, полученное из базы данных для анализа.

Тип данных 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)")
 

Хотя подобные ошибки публикуются во многих источниках, точное решение не было упомянуто.

Комментарии:

1. Переменная source_hash Python является ссылкой на строку. Вы пробовали source_hash = row.source_hash вместо этого?

Ответ №1:

В соответствии с показанной ошибкой,

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

source_hash в SQL-запросе (рядом с предложением WHERE) ожидает чего-то (либо строки, либо int), но ваша переменная source_hash не указывает точный тип данных и в коде, который вы использовали ''.join(raw) и source_hash = raw . Это означает, что необработанная переменная может быть списком или кортежем, если ваш код успешно скомпилирован для этой части.

Например,

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

это то, что ожидает SQL-запрос, но переменная source_hash может быть списком или кортежем,

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

Итак, попробуйте распечатать переменную source_hash, чтобы проверить ее тип данных. если он отображается, как в приведенном примере, вы можете использовать source_hash[0] его для его получения.