【问题标题】:How to retrieve scalar value from stored procedure (ADO.NET)如何从存储过程 (ADO.NET) 中检索标量值
【发布时间】:2009-06-25 13:17:49
【问题描述】:

如果在存储过程中,我只执行一条语句select count(*) from sometable,然后从客户端(我正在使用C# ADO.Net SqlCommand 调用存储过程),我如何检索count(*) 值?我正在使用 SQL Server 2008。

我很困惑,因为count(*)没有用作存储过程的返回值参数。

提前致谢, 乔治

【问题讨论】:

    标签: sql sql-server-2008 stored-procedures ado.net


    【解决方案1】:

    您要么按照 Andrew 的建议使用 ExecuteScalar - 要么您必须稍微更改您的代码:

    CREATE PROCEDURE dbo.CountRowsInTable(@RowCount INT OUTPUT)
    AS BEGIN
      SELECT
        @RowCount = COUNT(*)
      FROM 
        SomeTable
    END
    

    然后使用此 ADO.NET 调用来检索值:

    using(SqlCommand cmdGetCount = new SqlCommand("dbo.CountRowsInTable", sqlConnection))
    {
      cmdGetCount.CommandType = CommandType.StoredProcedure;
    
      cmdGetCount.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output;
    
      sqlConnection.Open();
    
      cmdGetCount.ExecuteNonQuery();
    
      int rowCount = Convert.ToInt32(cmdGetCount.Parameters["@RowCount"].Value);
    
      sqlConnection.Close();
    }
    

    马克

    PS:但在这个具体的例子中,我想只执行ExecuteScalar 的替代方案更简单,更容易理解。如果您需要返回多个值(例如,来自多个表等的计数),此方法可能工作正常。

    【讨论】:

      【解决方案2】:

      当您执行查询调用 ExecuteScalar - 这将返回结果。

      执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。

      由于您只返回一个值,这将只返回您的 count 表达式中的值。您需要将此方法的结果转换为int

      【讨论】:

      • 在这种情况下,您需要做:SELECT YOURVALUE -- 而不是 RETURN YOURVALUE
      • “你需要做:选择你的价值——而不是返回你的价值”——困惑,你是什么意思?你能解释一下吗?
      • @Andrew,我喜欢你的回答,但在阅读了 Marc 的回复后,我认为更优雅的方式应该使用存储过程的返回值,任何 cmets?
      • @George2:这两种解决方案都可以正常工作 - 你应该选择你喜欢的一个:)
      【解决方案3】:

      marc_s 的答案对整数很有效。但对于 varchar,必须指定长度。

      cmdGetCount.Parameters.Add("@RowCount", SqlDbType.varchar,30).Direction = ParameterDirection.Output;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-06
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        相关资源
        最近更新 更多