从pyodbc调用过程时出错

时间:2016-04-29 00:38:44

标签: python sql-server stored-procedures pyodbc

这是我的第一个问题。所以,如果重复或格式化已关闭,我很抱歉。我搜索了其他问题并且错误很常见,但是出现在多种情况中。

我有一个非常简单的python代码,我想在pyodbc中执行MSSQL中的过程。

import pyodbc
conn = pyodbc.connect(r'DSN=myDSN')
cursor = conn.cursor()
query = r'{call myproc}'
cursor.execute(query)

我在读取ODBC使用调用来执行MSSQL中的过程后,使用call而不是exec。

我得到的错误如下:

Traceback (most recent call last):
File "myscript.py", line 26, in <module>
cursor.execute(query)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The current transaction has aborted, and any pending changes have been rolled back. Cause: A transaction in a rollback-only state was not explicitly rolled back before a DDL, DML or SELECT statement.  (111233) (SQLExecDirectW)')

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

如果有人遇到同样的问题。我能够找出问题所在。当您使用DSN打开连接时,自动提交设置为 False 。出于某种原因,这应该是 True 以使代码工作(这在很大程度上取决于我在MSSQL上做了什么)。

import pyodbc
conn = pyodbc.connect(r'DSN=myDSN', autocommit=True)
cursor = conn.cursor()
query = r'{call myproc}'
cursor.execute(query)

运行良好!

答案 1 :(得分:1)

以下是两个如何通过pyodbc在MS SQL Server中执行存储过程的示例:

传递NULL,并且VARCHAR&#39; tallen&#39;作为位置参数变量:

cursor.execute('EXEC usp_get_user_data ?, ?', None, 'flipperpa')

将两个VARCHAR值作为命名参数变量传递:

cursor.execute('EXEC usp_get_user_data @user_full_name = ?, @user_username = ?', 'flip', 'flipperpa')

然后遍历返回的数据:

rows = cursor.fetchall()
for row in rows:
    # Do stuff
    print(row.user_id)
祝你好运!

答案 2 :(得分:0)

我遇到了使用SQL Server 2008执行存储过程的问题。我做的第一步是转到控制面板&gt;管理工具&gt;数据源(ODBC)&gt;添加驱动程序

enter image description here

我在python代码中做的唯一更改是使用“{call procdev_2017}”。我尝试使用exec而不是调用

时出错
import pyodbc


conn = pyodbc.connect(driver='{SQL Server Native Client 11.0}', server='XXXXXXX', database='XXX',
                      trusted_connection='yes', autocommit=True)
bepcur = conn.cursor()
ipcur.execute("{call procdev_2017}")