簡體   English   中英

當php mssql_query執行時,MS SQL try catch被忽略

[英]MS SQL try catch ignored when executed by php mssql_query

我使用try catch塊在MS SQL 2005中使用簡單的存儲過程簡化了我的問題。

它是這樣的:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE testError

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    BEGIN TRY
    DECLARE @X INT
    ---- Divide by zero to generate Error
        SET @X = 1/0
        select 'Command after error in TRY block' AS retour
    END TRY
    BEGIN CATCH
        select 'Error Detected' AS retour
        return
    END CATCH
    select 'Command after TRY/CATCH blocks' AS retour
END

當我在管理工作室中執行它時,我得到以下結果:檢測到錯誤,這是我想要的。

但是當我使用mssql_query在PHP 5.3.2中執行它時,我得到以下結果:TRY塊中的錯誤后命令

為什么遇到SQL錯誤時沒有觸發我的catch塊?

我希望SQL停止進一步執行並轉到catch塊,就像在管理工作室中一樣。

非常感謝你的幫助!

編輯:添加了SET ANSI_NULLS ONQUOTED_IDENTIFIER因為它們出現在我的測試程序中

編輯2:我嘗試將除法更改為0,因為有人指出我某些配置可能會忽略它們。 我用失敗的插入替換它,返回“字符串或二進制數據將被截斷。”。 同樣的問題仍然存在。

編輯3:重要信息:我最終使用PHP處理了一個不同的錯誤。 我用drop table #notExistingTable生成一個錯誤,這次,它會進入catch塊,一切正常。 但是除以零或“字符串或二進制數據將被截斷”。 它不起作用。 似乎忽略了一些錯誤,有些錯誤會觸發catch塊。 在PHP中是否有特定的配置,我可以更改為與管理工作室相同並捕獲相同的錯誤嚴重性?

我意識到這個線程已經老了,但我已經驗證了這個錯誤。 違規參數是ARITHABORT ,PHP腳本需要在發送EXEC查詢之前運行SET ARITHABORT ON query查詢。 您可以使用SET ARITHABORT OFF在管理工作室中復制

如果連接的ARITHABORT = OFF ,則程序將在DIV BY 0行終止,並且不會執行CATCH。

您可以在過程開始時嘗試SET XACT_ABORT ON 也許錯誤是由於嘗試在“exception”語句之后執行select語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM