@Razer1511

Ошибка конвертирования SQL. Как исправить?

Всем добрый день. Помогите решить проблему.

1. Подключаюсь к БД через pyodbc
2. Пытаюсь извлечь данные из таблицы ( хочу получить данные столбца ACTIVE у блока с именем 4-20 )
3. Получаю ошибку:

Мой код:

import pyodbc


def connect_to_base():  # Подключение к БД
    global cursor
    server = ************
    database = ************
    username = ************
    password = ************
    cnxn = pyodbc.connect(
        'DRIVER={ODBC Driver 17 for SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username +
        ';PWD=' + password)
    cursor = cnxn.cursor()


def select(column, db_table, obj):  # Чтение таблиц в БД
    cursor.execute('SELECT {} FROM {} WHERE NAME =  {}'.format(column, db_table, obj))
    row = cursor.fetchone()
    while row:
        if row[0] != False:
            print('Блок {} - активен           <<OK OK OK>>  [1/1]'.format(obj))
        else:
            print('Блок {} - неактивен         ERROR ERROR ERROR  [1/1]')
            row = cursor.fetchone()


connect_to_base()
select('ACTIVE', '[dbo].[BLAST_BLOCK]', '4-20')


5fb24c62e7e25472709075.png

После выполнения функции select появляется ошибка:

Traceback (most recent call last):
File "C:/Users/user/Desktop/Testing/123.py", line 28, in
select('ACTIVE', '[dbo].[BLAST_BLOCK]', '4-20')
File "C:/Users/user/Desktop/Testing/123.py", line 17, in select
cursor.execute('SELECT {} FROM {} WHERE NAME = {}'.format(column, db_table, obj))
pyodbc.DataError: ('22018', "[22018] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Conversion failed when converting the nvarchar value 'NoBlock1' to data type int. (245) (SQLExecDirectW)")


Пробовал конвертировать в CAST ( {} AS NVARCHAR ), успехов не принесло.
Столбец name, тип данных: nvarchar
  • Вопрос задан
  • 921 просмотр
Решения вопроса 1
@o5a
Не особо знаком с pyodbc, но насколько понимаю, проблема в передаче значения без кавычек, т.е. select получается
SELECT ACTIVE FROM [dbo].[BLAST_BLOCK] WHERE NAME =  4-20

вместо корректного
SELECT ACTIVE FROM [dbo].[BLAST_BLOCK] WHERE NAME =  '4-20'

Лучше использовать передачу параметров вместо форматирования строки (именно для передачи значений полей), в таком случае не должно быть проблем с типами.
cursor.execute('SELECT {} FROM {} WHERE NAME =  ?'.format(column, db_table), obj)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы