如何优雅地检查存储过程的返回值

时间:2009-06-25 14:46:18

标签: c# .net sql-server stored-procedures ado.net

这是我当前的存储过程实现,它返回给定订单ID的订单状态。有两种情况,

  1. 匹配订单ID,我将检索相关状态
  2. 没有匹配的订单ID(即不存在的订单ID)。
  3. 我的困惑是,如何在一个存储过程中优雅/高效地实现这两个功能,以便我返回情况1的匹配订单ID,并指出客户在情况2中没有匹配的订单ID?

    我使用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
    
    提前谢谢, 乔治

3 个答案:

答案 0 :(得分:3)

为什么使用输出参数。

您只需要将存储过程结果存入数据访问层的数据集中。 只需检查 if(dataset!= null)然后取值,否则将相应的消息返回到您的业务层。

答案 1 :(得分: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返回的内容并采取相应的操作。

  3. 作为附加提示,在SPROC中将值赋给@Status变量时,请使用SET而不是SELECT。如果找不到匹配项,这将保证您返回NULL。所以,

    `      - 在此处插入程序声明

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

答案 2 :(得分:1)