2009-06-25 46 views
0

这是我当前实现的存储过程,它为给定的订单ID返回订单状态。有两种情况,如何优雅检查存储过程返回值

  1. 有匹配订单ID,我会检索相关的状态,
  2. 没有匹配的订单ID(即不存在订单ID)。

我的困惑是,如何在一个存储过程中优雅地/有效地实现这两个函数,以便为情境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 

由于事先 乔治

回答

2

有多种方法可以采取:

  1. 保持的一切,是在你的.NET代码,如果返回的@status值DBNull,则它将指示情况2,否则情况为1.

  2. 向SPROC添加RETURN语句并使用

    昏暗的returnValue作为新的SqlParameter( “@ RETURN_VALUE”,SqlDbType.Int)

    returnValue.Direction = ParameterDirection.ReturnValue

    Cmd.Parameters.Add(的returnValue)

    在.NET

    代码明确识别SPROC返回的内容并相应采取行动。

作为附加提示,当将值分配给SPROC中的@Status变量时,使用SET而不是SELECT。如果没有找到匹配,这将保证你返回NULL。所以,

` - Insert语句的过程这里

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

谢谢,您的解决方案1,我应该打电话的ExecuteNonQuery或调用ExecuteReaer方法? – George2 2009-06-25 15:04:07

3

为什么您使用的输出参数。

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