Solved

RAISERROR

Posted on 2009-05-20
8
465 Views
Last Modified: 2012-05-07
Hi Experts ..

I have a procedure similar to the one I posted bellow, and I am trying to catch the exception from C# method to determine if the exception was thrown from within the IF block or not.

I want to build the application logic based on that .. do you have any idea how to do it?

Thanks
CREATE PROCEDURE spAddSomething
          @ID  BIGINT OUTPUT,
           @AnotherID BIGINT,
AS
BEGIN
     IF (NOT EXIST(SELECT [ID] FROM TableX WHERE [ID] = @AnotherID))
     BEGIN
        RAISERROR ('The passed Another Id odes not exist in persistence.', 16, 1)
     END
     .. insert statement
END

Open in new window

0
Comment
Question by:elkhawajah
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
  • 2
8 Comments
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 24432390
I am NOT sure about handling this at the front end, i think it is better to return another value in case the ID exists rather than a RAISERROR


CREATE PROCEDURE spAddSomething
          @ID  BIGINT OUTPUT,
           @AnotherID BIGINT,
AS
BEGIN
     IF EXISTS(SELECT [ID] FROM TableX WHERE [ID] = @AnotherID)
     BEGIN
        SET @ID = -201
        RETURN
     END
     .. insert statement
END

go


or else you can modify the sp like this

    INSERT INTO TableX
    SELECT
    WHERE NOT EXISTS (SELECT 1 FROM TableX where ID = @AnotherID)
   SELECT @ID = SCOPE_IDENTITY()

at the front end, if the return id is NULL, NO insert operation performed .
0
 
LVL 1

Author Comment

by:elkhawajah
ID: 24433942
I cannot believe that this cannot be done in Sql Serverr 2005! in Oracle I get used to set an error number in the thrown exception, use that number to determine the cause of the problem.
0
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 24434216
>I cannot believe that this cannot be done in Sql Serverr 2005!
I am not sure about this, i dont think any logic why you use sql server to throw an error rather than returning an error code; databases designed to store and retrieve the data, and it should be the front end's task to manipulate them. May be someone from .Net can answer your qn. to be frank this is 'Bad usage of SQL'
:)
0
Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 24434281
Where is the problem?  C#, T-SQL?
0
 
LVL 1

Author Comment

by:elkhawajah
ID: 24434362
I would expect the procedure to throw exception, and I can use a code similar to the posted below to throw specific exception based on the cause error.
try
{
     .. Execute Procedure
}
catch(Exception ex)
{
    if(ex.InnerException is SqlException)
    {
        if((ex.InnerException as SqlException).Number == EntityNotFoundNumber)
        {
              throw new EntityNotFoundCustomException(msg, ex.InnerException);
        }
    }
    throw new ServiceCustomException(msg, ex);
}

Open in new window

0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 24434503
So is the RAISEERROR throwing the exception in the Stored Procedure?
0
 
LVL 1

Author Comment

by:elkhawajah
ID: 24434560
Yes, but I want to use the information in RAISERROR to determine the cause of the error in the stored procedure, and throw the proper custom exception type.

I have more than one RAISERROR in the stored procedure, and each error has a corresponding custom exception in C# code.
0
 
LVL 75

Accepted Solution

by:
Anthony Perkins earned 250 total points
ID: 24436890
I guess I am not following.  The error is raised in T-SQL, so what is missing? Are you saying you need a different error number in each case? If so then give it a different number.  For custom errors the convention is to use numbers > 50000.
0

Featured Post

Space-Age Communications Transitions to DevOps

ViaSat, a global provider of satellite and wireless communications, securely connects businesses, governments, and organizations to the Internet. Learn how ViaSat’s Network Solutions Engineer, drove the transition from a traditional network support to a DevOps-centric model.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Everyone has problem when going to load data into Data warehouse (EDW). They all need to confirm that data quality is good but they don't no how to proceed. Microsoft has provided new task within SSIS 2008 called "Data Profiler Task". It solve th…
Ever wondered why sometimes your SQL Server is slow or unresponsive with connections spiking up but by the time you go in, all is well? The following article will show you how to install and configure a SQL job that will send you email alerts includ…
Via a live example, show how to setup several different housekeeping processes for a SQL Server.
Using examples as well as descriptions, and references to Books Online, show the documentation available for datatypes, explain the available data types and show how data can be passed into and out of variables.

732 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question