pyodbc失败而没有错误

时间:2015-07-24 09:17:05

标签: python sql-server pyodbc

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

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

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

  1. 它的运行时间与通常相同
  2. 我没有错误
  3. 无意更新的表格更新
  4. 我运行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%解决这个问题,似乎有两个组成部分:

    • Python代码:如果我使用相同的python代码但是将存储过程更改为另一个,则python代码可以正常工作
    • SQL代码:“问题”存储过程在T-SQL中有效,但在pyodbc中运行则不行。

    这似乎与两者的结合有关。

1 个答案:

答案 0 :(得分:3)

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

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

或者,在关闭连接之前:

conn.commit()