2009-06-25 13 views
0

Вот моя текущая реализация хранимой процедуры, которая возвращает статус заказа для данного Идентификатора заказа. Есть две ситуации,Как правильно проверить возвращаемое значение хранимой процедуры

  1. есть совпадающая ID заказа, и я буду получать соответствующий статус,
  2. нет никакого соответствует ID заказа (т.е. несуществующие ID заказа).

Мое замешательство заключается в том, как реализовать две функции элегантно/эффективно в одной хранимой процедуре, чтобы я возвращал согласованный идентификатор заказа для ситуации 1, а также указывал, что клиент не сопоставил идентификатор заказа в ситуации 2?

Я использую VSTS 2008 + C# + ADO.Net + .Net 3.5 как клиент и использую SQL Server 2008 как сервер.

CREATE PROCEDURE [dbo].[GetStatus] 
    @ID [nvarchar](256), 
    @Status [int] output 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT @Status = [Status] 
    FROM [dbo].[OrderStatus]   
    WHERE (@ID = [ID]); 
END 

спасибо заранее, Джордж

ответ

2

Есть несколько подходов можно принять:

  1. Держите все, как есть и в вашем коде .NET, если значение @status Возвращается DBNull, то это укажет на ситуацию 2, в противном случае ситуация 1.

  2. Добавить инструкцию RETURN на SPROC и использовать

    Dim ReturnValue As New SqlParameter ("@ return_value", SqlDbType.Int)

    returnValue.Direction = ParameterDirection.ReturnValue

    Cmd.Parameters.Add (ReturnValue)

    в вашем .NET чтобы явно определить, что возвращает SPROC и принять соответствующие меры.

Как дополнительный совет, используйте SET вместо SELECT при назначении значения переменной @Status в SPROC. Это гарантирует, что вы получите NULL обратно, если совпадения не найдено. Так,

` - Вставка заявление для процедуры здесь

SET @Status = SELECT [Status] 
FROM [dbo].[OrderStatus]    
WHERE (@ID = [ID]);` 
+0

Спасибо, за ваше решение 1, я должен позвонить ExecuteNonQuery или позвонить ExecuteReader? – George2

+0

Добро пожаловать! ExecuteReader выполнит эту работу за вас. –

3

почему вы используете выходной параметр.

Вам просто нужно вернуть результат хранимой процедуры в набор данных уровня доступа к данным. просто проверьте, что if (dataset! = Null) затем возьмите значение else, верните соответствующее сообщение на свой бизнес-уровень.

Смежные вопросы