2013-12-10 151 views
4

我試圖使用pyodbc(與Python 2.7)調用存儲過程以將記錄插入到SQL Server 2012表中。我正在通過臨時表。pyodbc不會拋出SQL Server錯誤

我甩了我的SQL和當通過SQL Server管理控制檯執行時,它產生下面的外鍵錯誤:

Msg 547, Level 16, State 0, Procedure spInsertBondTickerValues, Line 26 
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__BondTickerValue__756D6ECB". 
The conflict occurred in database "QuantDev", table "dbo.Tickers". 
The statement has been terminated. 

然而,pyodbc沒有引發異常。我將如何測試得到的光標或連接以知道發生了問題,以及如何獲取錯誤消息?

非常感謝。

編輯以下是完整的SQL文本:

DECLARE @rawTbl [dbo].TickerValueTableType 
INSERT INTO @rawTbl (Ticker, BBName, LastValue, ValueTime, SourceDescr) VALUES 
('IBM', 'Equity', 179.230000, '2013-11-01 00:00:00.000000', 'Bloomberg'), 
('SPX', 'Index', 1803.710000, '2013-12-10 00:00:00.000000', 'Bloomberg') 
EXEC [dbo].spInsertBondTickerValues @rawTbl 

EDIT 2下面是相關Python代碼:

def execSQLwithCommit(self, sql): 
    cursor = self.conn.cursor() 
    cursor.execute(sql) 
    self.conn.commit() 

其中,連接已經通過

指出過
self.conn = pyodbc.connect(app  = appName, 
          driver = '{SQL Server Native client 11.0}', 
          server = server, 
          database = db, 
          Trusted_Connection = 'yes') 
+0

請有關Python代碼更新,其中pyodbc.Cursor是instanti並執行。 – Bryan

+0

@beargle完成。謝謝。 – gt6989b

+0

它看起來像你的SQL腳本缺少任何分號。我想知道它是否被解析。 SQL Server控制檯可能足夠聰明來解析它,但驅動程序同樣聰明嗎?我還懷疑腳本有三個不同的語句,每個語句都可能需要單獨的'.execute'調用。 – 9000

回答

5

我可以使用下面的代碼,從而未能默默地重新您的問題:

import pyodbc 
cnxn = pyodbc.connect('DSN=myDb;') 
cursor = cnxn.cursor() 
sql = """ 
DECLARE @rawTbl dbo.ClientAddressInputType; 
INSERT INTO @rawTbl (ClientID, Addr1) VALUES 
(2, 'higgy'), 
(3, 'jiggy'); 
EXEC dbo.AddClientAddress @rawTbl 
""" 
cursor.execute(sql) 
cursor.commit() 
cnxn.close() 

不過,我可以得到代碼,只需在sql字符串的開頭添加SET NOCOUNT ON;拋出相應IntegrityError例外:

import pyodbc 
cnxn = pyodbc.connect('DSN=myDb;') 
cursor = cnxn.cursor() 
sql = """ 
SET NOCOUNT ON; 
DECLARE @rawTbl dbo.ClientAddressInputType; 
INSERT INTO @rawTbl (ClientID, Addr1) VALUES 
(2, 'higgy'), 
(3, 'jiggy'); 
EXEC dbo.AddClientAddress @rawTbl 
""" 
cursor.execute(sql) 
cursor.commit() 
cnxn.close() 

導致

Traceback (most recent call last): 
    File "C:\Users\Gord\Desktop\pyOdbc.py", line 12, in <module> 
    cursor.execute(sql) 
IntegrityError: ('23000', '[23000] [Microsoft][SQL Server Native Client 10.0][SQL Server]The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ClientAddresses_Clients". The conflict occurred in database "myDb", table "dbo.Clients", column \'ClientID\'. (547) (SQLExecDirectW); [01000] [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been terminated. (3621)') 
+0

謝謝,將嘗試重現,如果它有效,將接受。非常感謝你的幫助,我非常感謝。 – gt6989b