如果有人能指出我正确的方向,我会感兴趣。
我有一个非常长的存储过程(它还包含对其中的其他存储过程的调用),它更新了各种表。
如果我在管理工作室中运行存储过程,它运行正常。如果我从pyodbc调用它,那么:
我运行pyodbc一直执行存储过程并且没有任何问题 - 我知道我的连接或调用没有任何问题,就好像我将更短的存储过程替换为python代码在同一个地方工作正常。< / p>
存储过程会产生一些“警告: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()
只是要100%解决这个问题,似乎有两个组成部分:
这似乎与两者的结合有关。
答案 0 :(得分:3)
你能包括你的pyodbc连接字符串吗?听起来您在连接时没有设置自动提交,这会导致您在连接关闭时回滚所做的更改。如果是这种情况,您有两种选择。首先,您可以在连接时将自动提交设置为打开:
conn = pyodbc.connect(connection_str, autocommit=True)
或者,在关闭连接之前:
conn.commit()