2016-04-29 25 views
5

這是我的第一個問題。所以,如果重複或格式化關閉,我很抱歉。我通過其他問題進行了搜索,錯誤很常見,但出現在多種情況下。從pyodbc調用過程時出錯

我有一個非常簡單的python代碼,我想從pyodbc在MSSQL中執行一個過程。

import pyodbc 
conn = pyodbc.connect(r'DSN=myDSN') 
cursor = conn.cursor() 
query = r'{call myproc}' 
cursor.execute(query) 

我在使用call而不是exec之後,讀取ODBC使用調用來執行MSSQL中的過程。

我得到的錯誤是:

Traceback (most recent call last): 
File "myscript.py", line 26, in <module> 
cursor.execute(query) 
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The current transaction has aborted, and any pending changes have been rolled back. Cause: A transaction in a rollback-only state was not explicitly rolled back before a DDL, DML or SELECT statement. (111233) (SQLExecDirectW)') 

感謝您的幫助

+0

CALL用於MySQL,而不是MSSQL。 – FlipperPA

+0

@FlipperPA - 實際上,'{CALL ...}'語法是通過ODBC(和JDBC)調用存儲過程的標準方式,當我嘗試它時,它確實適用於我(使用pyodbc 3.0.7和SQL Server Native Client 10.0)。 –

+0

呵呵,那年前我遇到了錯誤,但現在我想到了它,它可能是通過Perl的DBD :: ODBC。感謝Gord! – FlipperPA

回答

1

下面是關於如何通過pyodbc在MS SQL Server中執行一個存儲過程的兩個例子:

傳遞NULL和VARCHAR'tallen'作爲位置參數變量:

cursor.execute('EXEC usp_get_user_data ?, ?', None, 'flipperpa') 

傳遞兩個VARCHAR值作爲命名參數變量:

cursor.execute('EXEC usp_get_user_data @user_full_name = ?, @user_username = ?', 'flip', 'flipperpa') 

然後遍歷返回的數據:

rows = cursor.fetchall() 
for row in rows: 
    # Do stuff 
    print(row.user_id) 

祝你好運!

2

如果有人遇到同樣的問題。我能夠找出問題所在。當您使用DSN打開連接時,自動提交將設置爲False。出於某種原因,這應該是True代碼工作(這主要取決於我在MSSQL上做什麼)。

import pyodbc 
conn = pyodbc.connect(r'DSN=myDSN', autocommit=True) 
cursor = conn.cursor() 
query = r'{call myproc}' 
cursor.execute(query) 

這個運行良好!

0

我有問題與使用SQL Server 2008中的第一步我所做的是要進入控制面板 - >管理工具 - >數據源(ODBC)>添加驅動程序

enter image description here

執行存儲過程

我在我的python代碼中做的唯一更改是使用「{call procdev_2017}」。當我嘗試使用exec而不是通話時出現錯誤

import pyodbc 


conn = pyodbc.connect(driver='{SQL Server Native Client 11.0}', server='XXXXXXX', database='XXX', 
         trusted_connection='yes', autocommit=True) 
bepcur = conn.cursor() 
ipcur.execute("{call procdev_2017}")