我有一个问题,pyodbc无法捕获从存储过程返回的错误。我实际的存储过程做了很多工作,但是为了演示这个错误,我创建了一个简单的proc和相关的python代码。相关代码如下:
存储过程:
CREATE PROCEDURE [dbo].[testErrors]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
insert into Parameter(Name, Units, DataType) values (null, null, null)
END
GO
Python代码:
^{pr2}$我得到了预期的错误:
cursor.execute("exec testErrors")
pyodbc.IntegrityError: ('23000', "[23000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert the value NULL into column 'Name', table 'Parametrics.dbo.Parameter'; column does not allow nulls. INSERT fails. (515) (SQLExecDirectW); [01000] [Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated. (3621)")
但是,当我修改存储过程以包含select语句时,错误不再返回到python代码中。Python代码就像没有发生错误一样退出。在
更新的存储过程:
CREATE PROCEDURE [dbo].[testErrors]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select 108
-- Insert statements for procedure here
insert into Parameter(Name, Units, DataType) values (null, null, null)
END
GO
当结果记录通过select语句交错时,pyodbc似乎看不到错误。这里的问题是什么?有没有办法克服这个问题?在
编辑:我用pymssql尝试了这个方法,看到了相同的行为
我可以使用pypyodbc在python3.4.3中重新创建您的问题,也可以使用ADO使用VBScript重新创建您的问题。看起来,一旦存储过程发出了结果集,ODBC会注意到SP返回了某些东西,并且SP中的后续错误不会触发调用过程中的错误。在
一种可能的解决方法是构造存储过程,使其在结束之前不会生成任何结果集。如果T-SQL代码在执行任何创建结果集的SELECT之前遇到错误,则错误将被传递回调用者。例如,这个经过调整的存储过程版本确实抛出了py[py]odbc可以捕捉到的错误:
相关问题 更多 >
编程相关推荐