Один только успешный запрос, случайный сбой, когда внутри приложения с «Связанным оператором не подготовлено» - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть набор операторов для извлечения данных.Сам запрос, кажется, работает нормально, но при быстром последовательном выполнении внутри приложения несколько раз некоторые запросы не выполняются.У меня очень ограниченная информация о взаимодействии каждого из компонентов, поэтому я хотел бы начать с простого изложения некоторых вещей.

Заявления

Вот некоторые из используемых технологий:

  • SQL Server, используя Microsoft ODBC Driver 17 для SQL Server
  • Python с pyodbc, обрабатывающим базы данных, Flask, обслуживающий localhost
  • VB / C # .NET-приложение, вызывающееPython

И некоторые свойства системы:

  • Соединения с базой данных объединяются в пул (pyodbc по умолчанию)
  • Новый курсор создается и удаляется для каждоговыполненный запрос
  • Python не является ни многопоточным, ни несколькими процессами
  • .NET является многопоточным, так как является веб-службой, вызовы Python внутри выполняются несколькими параллельными пакетами

Код

Вот суть типа выполненных запросов:

SET NOCOUNT ON;

DECLARE @Result TABLE (ID int unique not null, fields int varchar etc.);

--------- Base information ----------

INSERT INTO @Result (ID, subset of fields)
SELECT c.ID and various fields from joined tables
WHERE conditions hold

--------- Concatenated field --------

UPDATE @Result
SET Concat = r.Concat
FROM (
    SELECT o.ID AS ide, STUFF((
        SELECT ' ' + t.ID
        FROM various tables
        FOR XML PATH ('')), 1, 1, ''
    ) AS Concat
    WHERE conditions hold
) r
WHERE conditions hold;

SELECT * FROM @Result;

И результаты читаются в Python так:

with connection.cursor() as cursor:
    cursor.execute(q)
    rows = cursor.fetchall()
    columns = [(c[0], c[1]) for c in cursor.description]

Задача

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

[HY007] [Microsoft] [Драйвер ODBC 17 для SQL Server] Связанный оператор не подготовлен (0)(SQLNumResultCols)

У вас есть идеи, что здесь происходит? Я не смог найти ни одного подобного случая, и даже информация о самой ошибке недостаточна.Лучшее, что я мог найти, было это сообщение на форуме .


Для дополнительного контекста, перед созданием нового курсора при каждом вызове и соединением с MARS-соединением Я получал разные ошибки:

[HY000] [Microsoft] [Драйвер ODBC 17 для SQL Server] Соединение занято с результатами для другой команды (0) (SQLExecDirectW)

('HY000', 'Драйвер не выдал ошибку!')

[HY010] [Microsoft] [Диспетчер драйверов ODBC] Ошибка последовательности функций (0) (SQLRowCount)

Отказ от ответственности

Я знаю, что это не совсем воспроизводимая ситуация.Тем не менее, я чувствую, что проблема в том, что более опытный разработчик вполне может решить подобную проблему.Из-за возможного отсутствия четких ответов, я был бы признателен за любые указания по началу решения этой проблемы.

Редактировать

Новые подключения и отсутствие пула

Новая процедура длязапрос будет выглядеть следующим образом:

connection = pyodbc.connect(**keywords)
with connection.cursor() as cursor:
    cursor.execute(q)
    rows = cursor.fetchall()
connection.close()

Создание нового соединения для каждого вызова без объединения пулов. Вначале получается несколько успешных вызовов, но к концу пакета выдается операционная ошибка.

pyodbc.OperationalError: ('08001', '[08001] [Microsoft] [Драйвер ODBC 17 для SQL Server] Шифрование не поддерживается на клиенте. (21) (SQLDriverConnect); [08001] [Microsoft] [Драйвер ODBC17 для SQL Server] Клиент не может установить соединение (21); [08001] [Microsoft] [Драйвер ODBC 17 для SQL Server] Недопустимый атрибут строки подключения (0); [08001] [Microsoft] [Драйвер ODBC 17 для SQL Server]При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или недоступен. Проверьте правильность имени экземпляра и SQL Server Serv.Он настроен для разрешения удаленных подключений.Дополнительные сведения см. В электронной документации по SQL Server.(0) ')

Эта ошибка кажется странной, если принять во внимание тот факт, что соединение было установлено много раз успешно с точно такими же ключевыми словами.

Фабрика приложений Flask

Использование нового соединения каждый раз и создание приложения внутри функции фабрики приложений вместо глобального файла приводит к успешному запуску всего пакета!Однако удаление любого из этих двух изменений возвращает исходную ошибку.Пул соединений не был проблемой.

Так что, действительно, я заработал, но это остается загадкой, что именно вызвало это, потому что я не смог сузить это достаточно.

...