python - pyodbc doesn't report sql server error -
i have issue pyodbc doesn't capture errors returned stored procedure. actual stored proc lot of stuff purpose of demonstrating error created simple proc , associated python code. relevant code below:
stored procedure:
create procedure [dbo].[testerrors] -- add parameters stored procedure here begin -- set nocount on added prevent result sets -- interfering select statements. set nocount on; -- insert statements procedure here insert parameter(name, units, datatype) values (null, null, null) end go python code:
import pyodbc connectstring = "driver={sql server};server=%s;database=%s;uid=%s;pwd=%s" % (r'srvr', r'mydb', r'usr', r'pwd') cnxn = pyodbc.connect(connectstring) cnxn.autocommit = true cursor = cnxn.cursor() cursor.execute("exec testerrors") cursor.close() error expected:
cursor.execute("exec testerrors") pyodbc.integrityerror: ('23000', "[23000] [microsoft][odbc sql server driver][sql server]cannot insert value null column 'name', table 'parametrics.dbo.parameter'; column not allow nulls. insert fails. (515) (sqlexecdirectw); [01000] [microsoft][odbc sql server driver][sql server]the statement has been terminated. (3621)") however when modified stored procedure include select statement error no longer comes python code. python code exits if no error has occurred.
updated stored procedure:
create procedure [dbo].[testerrors] -- add parameters stored procedure here begin -- set nocount on added prevent result sets -- interfering select statements. set nocount on; select 108 -- insert statements procedure here insert parameter(name, units, datatype) values (null, null, null) end go it seems pyodbc doesn't see error when there interleaving result records through select statements. issue here , there way overcome issue?
edit: tried pymssql , see same behavior
i able recreate issue python 3.4.3 using pypyodbc, , vbscript using ado. appears once stored procedure has emitted result set odbc notices sp has returned something , subsequent errors in sp don't trigger error in calling procedure.
one possible workaround structure stored procedure doesn't produce result set(s) until end. if t-sql code encounters error before executing select creates result set error gets passed caller. example, tweaked version of stored procedure throw error py[py]odbc can catch:
create procedure [dbo].[table1sp] begin declare @foo int; set nocount on; select @foo = 108; insert table1 (textcol) values (null); -- error here select @foo foo end
Comments
Post a Comment