【问题标题】:Error when calling a procedure from pyodbc从 pyodbc 调用过程时出错
【发布时间】:2016-04-29 00:38:44
【问题描述】:

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

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

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

在阅读了 ODBC 使用 call 在 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)')

感谢您的帮助

【问题讨论】:

  • CALL 用于 MySQL,而不是 MSSQL。
  • @FlipperPA - 实际上,{CALL ...} 语法是通过 ODBC(和 JDBC)调用存储过程的标准方法,当我尝试它时它确实对我有用(使用 pyodbc 3.0.7和 SQL Server Native Client 10.0)。
  • 嗯,几年前我遇到过错误,但现在我想,这可能是通过 Perl 的 DBD::ODBC。感谢上帝!

标签: python sql-server stored-procedures pyodbc


【解决方案1】:

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

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

运行良好!

【讨论】:

    【解决方案2】:

    这里有两个示例,说明如何通过 pyodbc 在 MS SQL Server 中执行存储过程:

    传递 NULL 和 VARCHAR 'tallen' 作为位置参数变量:

    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)
    

    祝你好运!

    【讨论】:

      【解决方案3】:

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

      我在 python 代码中所做的唯一更改是使用“{call procdev_2017}”。当我尝试使用 exec 而不是 call 时出现错误

      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}")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多