如果有人能给我指出正确的方向,我将感兴趣。
我有一个非常长的存储过程(还包含对其中其他存储过程的调用),它更新各种表。
如果我在管理工作室运行存储过程,它运行良好。如果我从pyodbc调用它,那么:
- 它运行的时间与通常相同
- I get no error
- 所有要更新的表都没有被更新
我一直运行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()