У меня проблемы с выполнением хранимой процедуры SQL Server с Python 3.4. Я импортирую Pyodbc для создания соединения и несколько строк, которые должны отправлять данные в хранимую процедуру.

Мой Питон:

sql = "exec <stored_procedure_name> @int1=?, @int2=?, @string1=?, @int3=?"
params = (irow[0], irow[15], irow[2], irow[6])
cursor.execute(sql, params)

Хранимая процедура:

  @int1 int,
  @int2 int,
  @string1 varchar(10),
  @int3 int
AS
BEGIN
  --Do stuff
END

Я не получаю ошибки в командной строке при выполнении сценария. Когда я печатаю

print(sql, params)

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

exec <stored_procedure_name> @int1=?, @int2=?, @string1=?, @int3=? (0, 0, 'string', 0)

Я новичок в Python, поэтому любая оценка будет принята с благодарностью. Ничто из того, что я видел на SO, не помогло.

4
localhost 15 Дек 2015 в 21:33

3 ответа

Лучший ответ

Я обнаружил, что проблема была вызвана отсутствием функции автоматической фиксации. По умолчанию в Pyodbc для автоматической фиксации установлено значение False.

Чтобы включить автокоммит, вы можете объявить соединение следующим образом:

cnxn = pyodbc.connect(driver="<driver>", server="<server>", database="<database>", uid="<username>", pwd="<password>", autocommit=True)
2
wargre 18 Сен 2017 в 17:33

Я думаю, что не хватает коммита. Либо запустите метод commit для курсора:

cursor.execute(sql, params)
cursor.commit()

Или установите autocommit=True, когда соединение создано, как в других предложенных ответах. Это соединение используется для создания курсора, поэтому ему присуще поведение автоматической фиксации при вызове execute():

cnxn = pyodbc.connect(driver="<driver>", server="<server>", 
                      database="<database>", uid="<username>", pwd="<password>", 
                      autocommit=True)
3
Nander Speerstra 28 Мар 2017 в 07:13

Параметры обычно передаются в виде кортежа, поэтому

params = (irow[0], irow[15], irow[2], irow[6])

Должно сработать

0
erkyky 15 Дек 2015 в 18:36