当我需要只获取params时,哪种SqlCommand方法更可取?

时间:2015-10-05 16:00:36

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

我只询问sync类的SqlCommand种方法。 有三种方法(众所周知) - ExecuteReader()ExecuteScalar()ExecuteNonQuery()

哪种方法更适合存储过程如下:

CREATE PROCEDURE [dbo].[pr_test]
    @partherId UNIQUEIDENTIFIER,
    @lowerBound SMALLINT = -1 out,
    @upperBound SMALLINT = -1 out
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        @lowerBound = ISNULL(MIN(SrartDayNumber), -1)
        ,@upperBound = ISNULL(MAX(EndDayNumber), -1)
    FROM [CpsOther].[dbo].[FinDocument] f
    WHERE f.partherId = @partherId
END

我只需要out参数而不需要其他任何内容。我不知道SqlCommand哪种方法更适合这种情况?或者它并不重要。 (结果相同)

int lowerBound = -1;
int upperBound = -1;
using (SqlConnection connection = new SqlConnection(_connectionString))
{
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandType = CommandType.StoredProcedure;
        command.CommandText = "[dbo].[pr_test]";

        SqlParameter lowerBoundParam = new SqlParameter
                                       {
                                           ParameterName = "@lowerBound",
                                           Value = lowerBound,
                                           Direction = ParameterDirection.Output
                                       };
        SqlParameter upperBoundParam = new SqlParameter
                                       {
                                           ParameterName = "@upperBound",
                                           Value = upperBound,
                                           Direction = ParameterDirection.Output
                                       };
        command.Parameters.AddWithValue("@partnerId", Guid.Empty);
        command.Parameters.Add(lowerBoundParam);
        command.Parameters.Add(upperBoundParam);

        connection.Open();

        object result = command.ExecuteScalar();
        //or object result = command.ExecuteNonQuery();
        lowerBound = lowerBoundParam.Value as int? ?? -1;
        lowerBound = lowerBoundParam.Value as int? ?? -1;
    }
}

1 个答案:

答案 0 :(得分:4)

ExecuteNonQuery是更好的解决方案。另外两个用于返回行集的命令。

详细说明:

  • ExecuteReader适用于您希望迭代命令返回的一组行的情况。

  • ExecuteScalar适用于您希望接收返回的第一行的第一列的情况。它会自动丢弃所有其他行数据。

  • ExecuteNonQuery适用于不直接返回行集的命令。

它们在具有Output,InputOutput或ReturnValue方向的参数方面具有相同的能力。唯一的区别是它们如何处理行集。