У меня есть набор операторов для извлечения данных.Сам запрос, кажется, работает нормально, но при быстром последовательном выполнении внутри приложения несколько раз некоторые запросы не выполняются.У меня очень ограниченная информация о взаимодействии каждого из компонентов, поэтому я хотел бы начать с простого изложения некоторых вещей.
Заявления
Вот некоторые из используемых технологий:
- 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
Использование нового соединения каждый раз и создание приложения внутри функции фабрики приложений вместо глобального файла приводит к успешному запуску всего пакета!Однако удаление любого из этих двух изменений возвращает исходную ошибку.Пул соединений не был проблемой.
Так что, действительно, я заработал, но это остается загадкой, что именно вызвало это, потому что я не смог сузить это достаточно.