Невозможно отправить LabNumber в sql-запрос

Я очень озадачен тем, почему моя переменная _labNumber не отправляется в метод, который я использую для вызова SQL-запроса, так как она работает для других методов в том же классе. У меня есть блок try catch в классе, который вызывает методы, где я передаю _labNumber (она правильно назначена, я трижды проверил ее)

try:
            _comment = self.dataServices.GetComment(_labNumber)
            _value2 = self.dataServices.GetValue2(_labNumber)
            _value1 = self.dataServices.GetValue1(_labNumber)
            _results = self.dataServices.getResults(_labNumber)
        except AttributeError:
            _comment = None
            _value2 = None
            _value1 = None
            _results = None

Это один из методов класса, который используется для получения данных из базы данных:

def GetValue2(self, _LabNumber):
    _LabNumberStr = str(_LabNumber)
    try:
        with connection.cursor() as _cursor:
            _cursor.execute("{CALL dbo.uspShireXGetValue2(%s)}", _LabNumberStr)
            row = _cursor.fetchone()
            if row:
                return {'VALUE2': row[0]}#21
            else:
                return {'VALUE2': None}
    except Exception as e:
        # Handle or log the exception as appropriate
        print(f"An error occurred: {e}")
        return {'VALUE2': None}

И, наконец, вот запрос, который, как я знаю, работает, поскольку он возвращает данные, когда я жестко задаю номер лаборатории:

@LabNumber VARCHAR(10)
AS

SET NOCOUNT ON
SELECT
    WDR.COMMENT
FROM dbo.DNA_WORKSHEET_DET WD
INNER JOIN dbo.DNA_WORKSHEET W ON WD.WORKSHEET = W.WORKSHEET
LEFT OUTER JOIN dbo.DNA_TEST T ON W.TEST = T.TEST
LEFT OUTER JOIN dbo.DNA_LAB_TEST LT ON WD.LABNO = LT.LABNO AND W.TEST = LT.TEST
LEFT OUTER JOIN dbo.DNA_WORKSHEET_DET_RESULT WDR ON WD.WORKSHEET = WDR.WORKSHEET AND WD.LANE = WDR.LANE
WHERE WD.LABNO = @LabNumber
return

Выдается ошибка 'An error occurred: not enough arguments for format string ' Любая помощь в исправлении этой ошибки будет очень признательна, так как я бьюсь головой об стену уже несколько дней.

Вам нужно обернуть параметр(ы) в список, поэтому:

def GetValue2(self, _LabNumber):
    _LabNumberStr = str(_LabNumber)
    try:
        with connection.cursor() as _cursor:
            _cursor.execute('{CALL dbo.uspShireXGetValue2(%s)}', [_LabNumberStr])
            row = _cursor.fetchone()
            if row:
                return {'VALUE2': row[0]}  # 21
            else:
                return {'VALUE2': None}
    except Exception as e:
        # Handle or log the exception as appropriate
        print(f"An error occurred: {e}")
        return {'VALUE2': None}

При этом, пожалуйста, не делайте необработанных запросов. Работая с QuerySet, вы можете дополнительно манипулировать тем же запросом: например, пагинация, фильтрация, аннотирование. Необработанный запрос этого не позволяет.

Вернуться на верх