【问题标题】:How to check stored procedure return value elegantly如何优雅地检查存储过程返回值
【发布时间】:2009-06-25 14:46:18
【问题描述】:

这是我当前实现的存储过程,它返回给定订单 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

提前致谢, 乔治

【问题讨论】:

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


    【解决方案1】:

    你为什么使用输出参数。

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

    【讨论】:

      【解决方案2】:

      您可以采取多种方法:

      1. 在您的 .NET 代码中保持一切原样,如果返回的@status 值为 DBNull,则表示情况 2,否则表示情况 1。

      2. 在 SPROC 中添加 RETURN 语句并使用

        Dim returnValue As New SqlParameter("@RETURN_VALUE", SqlDbType.Int)

        returnValue.Direction = ParameterDirection.ReturnValue

        Cmd.Parameters.Add(returnValue)

        在您的 .NET 代码中明确识别 SPROC 返回的内容并采取相应措施。

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

      ` -- 在此处插入过程语句

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

      【讨论】:

      • 感谢您的解决方案 1,我应该调用 ExecuteNonQuery 还是调用 ExecuteReader?
      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        相关资源
        最近更新 更多