2017-01-05 7 views
0

У меня есть программа python, которая использует pypyodbc для взаимодействия с базой данных MSSQL. Хранимая процедура создается в MSSQL и запускается через python. Если я выполняю хранимую процедуру только один раз (через python), проблем нет. Однако, когда он выполняется несколько раз в цикле for, я получаю следующую ошибку:pypyodbc - Неверное состояние курсора при выполнении хранимой процедуры в цикле

pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft] [Собственный клиент SQL Server 11.0] Неверное состояние курсора')

Мои питона детали код ниже:

connection_string_prod = 'Driver={SQL Server Native Client 11.0};Server=PSCSQCD1234.TEST.AD.TEST.NET\SQLINS99,2222;Database=Test;Uid=python;Pwd=python;' 

connection_prod = pypyodbc.connect(connection_string_prod) 

cursor_prod = connection_prod.cursor() 

get_files_to_load_query = "Get_Files_To_Load" 

files_to_load = cursor_prod.execute(get_files_to_load_query) 

for file_name in files_to_load: 
    load_query = "Load_Query_Stored_Proc @File_Name = '" + file_name + "'" 
    cursor_prod.execute(load_query) 

cursor_prod.commit() 
cursor_prod.close() 
connection_prod.close() 

в некоторых постах, было предложено использовать «SET NOCOUNT ON» в верхней части процедуры SQL хранится. Я уже это сделал, и это не помогло.

Ниже приведен код простой хранимой процедуры, которая вызывает вопрос:

CREATE PROCEDURE [dbo].[Test] 
AS 
SET NOCOUNT ON 

INSERT INTO Test(a) 
SELECT 1 

Почему выполнение хранимой процедуры в пределах цикла только вызывает проблему?

Просьба сообщить.

Спасибо!

+0

Есть ли у вас курсор в хранимой процедуре? Можете ли вы показать код хранимой процедуры? –

+0

У меня нет курсора внутри хранимой процедуры. Включенный образец хранит proc, который вызывает проблему в обновленном сообщении. –

+0

Не уверен, что это лучшее решение, но я смог решить свою собственную проблему, создав отдельное соединение и получив connection1, чтобы получить список файлов для загрузки, а connection2 вызовет хранимую процедуру для фактической загрузки в цикле for. Если это не ясно, и это поможет любому, я могу предоставить обновленный рабочий код. –

ответ

0

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

Вам не нужно, чтобы создать второй соединение, но вы должны использовать второй курсор для выполнения хранимой процедуры. Или вы можете использовать .fetchall, чтобы заполнить все имена файлов в списке files_to_load, а затем перебрать этот список, освободив курсор для запуска хранимой процедуры.

+0

Горд - спасибо за ваше объяснение/предложения. Я добавил .fetchall(), и вам больше не нужно 2-го соединения. Вы решили проблему! –