【问题标题】:pyodbc fails without errorpyodbc 失败且没有错误
【发布时间】:2015-07-24 09:17:04
【问题描述】:

如果有人能指出我正确的方向,我会很感兴趣。

我有一个很长的存储过程(其中还包含对其他存储过程的调用),用于更新各种表。

如果我在管理工作室中运行存储过程,它运行良好。如果我从 pyodbc 调用它,那么:

  1. 它的运行时间与通常相同
  2. 我没有收到任何错误
  3. 本应更新的表均未更新

我一直运行 pyodbc 来执行存储过程并且没有任何问题 - 我知道我的连接或调用没有任何问题,就好像我将较短的存储过程替换到 python 代码中它工作正常的地方一样。

存储过程确实会生成一些“警告:空值被聚合或其他 SET 操作消除”消息,我认为这些可能会导致问题,但每当我尝试 SET ANSI_WARNINGS { ON | OFF } 在存储过程内部或存储过程外部我得到一个 pyodbc.ProgrammingError

对这个问题有什么猜测吗?

Python 3.4 (have the same problem in 2.7), MSSQL, Windows 7

更新:

import pyodbc as p

def getconn():
    server='insertsqlservername'
    dbase='insertdbasename'
    connStr=('Driver={SQL Server};SERVER=' +
              server + ';DATABASE=' + dbase + ';' +
              'trusted=1')
    conn = p.connect(connStr)
    return conn

def runSQL():
    conn=getconn()
    cursor=conn.cursor()

    try:
        cursor.execute('exec InsertStoredProcName')
        conn.commit()
    except:
        print('sys.exc_info()[0])

    cursor.close()
    conn.close()

要 100% 解决问题,似乎有两个组成部分:

  • Python 代码:如果我使用相同的 Python 代码,但将存储的 proc 更改为不同的,则 Python 代码可以工作
  • SQL 代码:“问题”存储过程在 T-SQL 中有效,但在 pyodbc 中运行时无效

这似乎是两者的结合。

【问题讨论】:

  • 你能提供你的代码没有你的代码我们不能说什么
  • 如果你需要猜测,我相信你没有在 pyodbc 中提交更新
  • 感谢 Vignesh,确实提交了交易 - 添加了上面的 python 代码。对于 SQL,它的长度超过 1,000 行。我可以在 SQL 中看到的关键元素是存储过程的问题:a) 包含它调用的其他存储过程 b) 创建临时表 c) 更新其他表 d) 生成许多“警告:空值被消除聚合或其他 SET 操作”消息,我无法弄清楚如何同时关闭和使用 pyodbc
  • 打印语句中不应该有多余的'
  • 尝试a=cursor.fetchall() for c in a: print c 获取存储过程的输出

标签: python sql-server pyodbc


【解决方案1】:

你能包含你的 pyodbc 连接字符串吗?听起来您在连接时没有设置自动提交,这会导致您所做的更改在连接关闭时回滚。如果是这种情况,您有两个选择。首先,您可以在连接时将自动提交设置为开启:

conn = pyodbc.connect(connection_str, autocommit=True)

或者,在您关闭连接之前:

conn.commit()

【讨论】:

  • 感谢 Flipper,添加了上面的代码 - 肯定会提交事务,如果我替换存储的 proc 名称,那么 python 代码可以正常工作。
  • 感谢这为我节省了很多时间!
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多