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

C# 如何优雅地检查存储过程返回值,c#,.net,sql-server,stored-procedures,ado.net,C#,.net,Sql Server,Stored Procedures,Ado.net,这是我当前实现的一个存储过程,它返回给定订单ID的订单状态。有两种情况 有匹配的订单ID,我将检索相关状态 没有匹配的订单ID(即不存在的订单ID) 我的困惑是,如何在一个存储过程中优雅/高效地实现这两个函数,以便在情况1中返回匹配的订单ID,并在情况2中指示客户机没有匹配的订单ID 我使用VSTS2008+C#+ADO.Net+.NET3.5作为客户端,使用SQLServer2008作为服务器 CREATE PROCEDURE [dbo].[GetStatus] @ID [nvarc

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

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

    我使用VSTS2008+C#+ADO.Net+.NET3.5作为客户端,使用SQLServer2008作为服务器

    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
    
    提前感谢,,
    乔治

    您可以采取多种方法:

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

  • 将RETURN语句添加到存储过程并使用

    将returnValue设置为新的SqlParameter(“@RETURN\u VALUE”,SqlDbType.Int)

    returnValue.Direction=参数Direction.returnValue

    Cmd.Parameters.Add(返回值)

    在.NET代码中显式标识存储过程返回的内容,并采取相应的操作

  • 另外,在存储过程中将值指定给@Status变量时,请使用SET而不是SELECT。如果没有找到匹配项,这将保证返回空值。所以

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

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

    您可以采取多种方法:

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

  • 将RETURN语句添加到存储过程并使用

    将returnValue设置为新的SqlParameter(“@RETURN\u VALUE”,SqlDbType.Int)

    returnValue.Direction=参数Direction.returnValue

    Cmd.Parameters.Add(返回值)

    在.NET代码中显式标识存储过程返回的内容,并采取相应的操作

  • 另外,在存储过程中将值指定给@Status变量时,请使用SET而不是SELECT。如果没有找到匹配项,这将保证返回空值。所以

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

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

    为什么要使用输出参数

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

    为什么要使用输出参数

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

    您可以在存储过程中使用“if语句”。底部的网站提供了一些提示

    您可以在存储过程中使用“if语句”。底部的网站提供了一些提示


    谢谢,对于您的解决方案1,我应该调用ExecuteOnQuery还是调用ExecuteReader?谢谢,对于您的解决方案1,我应该调用ExecuteOnQuery还是调用ExecuteReader?