2015-10-05 22 views
0

我只問SqlCommand類的sync方法。 有三種方法(衆所周知) - ExecuteReader(),ExecuteScalar()ExecuteNonQuery()當我只需要輸出參數時,哪一種SqlCommand方法更可取?

哪一種方法,這是更適合的存儲過程喜歡這樣的:

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 PARAMS而已。我不知道哪種方法的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; 
    } 
} 

回答

4

ExecuteNonQuery是更好的解決方案。另外兩個是用於返回行集的命令。

要闡述:

  • ExecuteReader是要遍歷一組行由命令返回的情況。

  • ExecuteScalar適用於您希望接收返回的第一行的第一列的情況。它會自動丟棄所有其他行數據。

  • ExecuteNonQuery適用於不直接返回行集的命令。

它們都具有與Output,InputOutput或ReturnValue方向相同的參數。唯一的區別是他們如何處理行集。

相關問題