Pyodbc失败,没有错误



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

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

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

  1. 它运行的时间与通常相同
  2. I get no error
  3. 所有要更新的表都没有被更新

我一直运行pyodbc来执行存储过程并且没有任何问题-我知道我的连接或调用没有任何问题,就好像我在相同的地方将更短的存储过程替换为python代码一样,它工作得很好。

存储过程确实生成一些"警告:Null值被聚合或其他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()

要百分百地解决这个问题,似乎有两个组成部分:

  • Python代码:如果我使用相同的Python代码,但将存储过程更改为不同的过程,则Python代码工作
  • SQL代码:"问题"存储过程在T-SQL中工作,但在pyodbc
  • 中运行时不起作用

似乎是两者结合的结果

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

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

或者,在关闭连接之前:

conn.commit()

最新更新