sql error not thrown back to caller

五迷三道 提交于 2019-12-06 08:13:53

问题


I am new to this forum but please bear with me. I have a c# Windows form which has two checkboxes on it One is called chkThrowError and the other is called chkDivideError, both are unchecked. These controls are purely there to control execution of a stored procedure. I have a command Button with the following Code:

private void cmdError_Click(object sender, EventArgs e)
    {
        int ThrowError = 0;
        int DividByZero = 0;
        if (chkThrowError.Checked)
        {
            ThrowError = 1;
        }
        if (chkDivideError.Checked)
        {
            DividByZero = 1;
        }
        try
        {
            clsBBFinances.TestError(ThrowError,DividByZero);
            MessageBox.Show("Everything is Hunkey Dorey");

        }
        catch (Exception Ex)
        {
            MessageBox.Show(Ex.Message);
        }
    }

clsBBFinances is my Business Object and the TestError routine is as follows:

public static void TestError(int ThrowError, int ThrowDivideError)
    {
        System.Data.SqlClient.SqlDataReader objRs = null;
        string strsql = "";
        bool Success = true;
        string ErrMsg = "";
        int intCount = 0;
        try
        {
            strsql = strsql + "Exec ";
            strsql = strsql + "TestError " + ThrowError.ToString() + " , " + ThrowDivideError.ToString();
            objRs = clsBBFinances.TheDatabase.ExecuteReadOnly(strsql);
            while (objRs.Read())
            {
                intCount++;
                object xxx = objRs[0];

            }
            Success = true;
            ErrMsg = "";
            //intCount = objRs.RecordsAffected;



        }
        catch (Exception ex)
        {
            ErrMsg = ex.Message;
            intCount = 0;
            Success = false;
            throw ex;
        }
        finally
        {
            if (objRs != null)
            {
                if (!objRs.IsClosed)
                {
                    objRs.Close();
                }
            }
        }

    }

Please assume the syntax to be correct and I have a valid SQL connection (sql2008(R2))

This basically calls the following Stored Procedure:

Create PROCEDURE TestError 
(@ThrowError int=0
 ,@ThrowDivideError int= 0
 )
AS
BEGIN

SET NOCOUNT ON;
Declare @x int
Declare @y int

Declare @ErrorNumber int
Declare @ErrorMessage varchar(2000)
Declare @ErrorSeverity int
Declare @ErrorState int
Begin Try

    If isnull(@ThrowError,0) <>   0
    Begin
            RaisError ('Forced Error Raised',16,1)
            Return
    End
    If isnull(@ThrowDivideError,0) <>0
    Begin
          set @x = 5
          Set @y =0
          Select @x/@y as z
    End

End Try
Begin catch
    Select @ErrorNumber = Error_Number()
           ,@ErrorMessage = 'Test Error ' + Error_message()
           ,@Errorseverity= Error_Severity()
           ,@ErrorState = Error_State()

    RaisError (@Errormessage, @ErrorSeverity, @ErrorState)
    --THROW 51000, @Errormessage, @ErrorState;
    Return

End Catch
Select * from   information_Schema.tables





END
GO

Basically, I am raising an error dependant upon the parameter passed in.. If My first parameteer is non zero, I raise a custom error, and if the first is 0 and the second Non Zero then i execute a divide by zero to generate me a system Error. If Both are zero I do a simple select from Information_Schema.tables, just to finish it off. The purpose of the stored procedure is tocall MY error and a system error.

When I call the procedure and my first argument is set to 1, my custom error is raised, which goes through the SQl catch block and is subsequently trapped in my catch block in c#.

However, when I execute it with the second argument set to 1, the divide by zero error is trapped in the SQL catch block but it is NOT trapped by the catch block in c#. The code continues as if no error has occured.

I want to be able to catch the second error.. Does anybody know how. Please feel free to paste the above code and try it for yourselves.

Forced error I get the message Test Error Forced Error Raised.

Divide By Zero I get the message Everything is Hunkey Dorey, is NOT the case.

HELP needed please


回答1:


You're using a SqlDataReader, it reads only one result set at a time. The exception happens in the second result set. So you have to move the reader to the second result set with NextResult(). Then you hit the exception...

        var connection = new SqlConnection("Data Source=xxx;Initial Catalog=Test;User Id=xxx;Password=xxx");
        connection.Open();

        try
        {
            SqlCommand command = new SqlCommand();
            command.Connection = connection;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "TestError";
            command.Parameters.AddWithValue("@ThrowDivideError", 1);
            var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            reader.Read();
            reader.NextResult();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadLine();


来源:https://stackoverflow.com/questions/16046065/sql-error-not-thrown-back-to-caller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!