2015-08-17 62 views
8

使用ExecuteReader我能夠返回DataReader返回的輸出參數,但是out參數返回0。可以使用DataReader

使用ExecuteNonQuery我能夠檢索out參數(正確的值)但ExecuteNonQuery不返回DataReader

下面是該過程給背景:

SQL查詢:

CREATE PROCEDURE [dbo].[SelectDays] 
    @dateStart datetime, 
    @dateEnd datetime, 
    @recordCount bigint out 
AS 
BEGIN 
    select @recordCount = count(*) 
    from dbo.[Days] 
    where [Date]>[email protected] and [Date]<[email protected]; 

    select [ID],[Name] 
    from dbo.[Days] 
    where [Date]>[email protected] and [Date]<[email protected]; 
END 

有沒有一種方法,我可以返回一個DataReader還有out參數,或者我應該創建兩個單獨的程序每?

C#代碼:

 Int32 returnValue = 0; 

    Parameters parameters = new Parameters(); 
    parameters.Add(new SqlParameter("@dateStart", dateStart != null ? (object)dateStart : DBNull.Value)); 
    parameters.Add(new SqlParameter("@dateEnd", dateEnd != null ? (object)dateEnd : DBNull.Value)); 
     SqlParameter out_recordCount = new SqlParameter("@recordCount", SqlDbType.BigInt); 
     out_recordCount.Direction = ParameterDirection.InputOutput; 
     out_recordCount.Value = recordCount; 
     parameters.Add(out_recordCount); 

    SqlParameter return_Value = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); 
    return_Value.Direction = ParameterDirection.ReturnValue; 
    parameters.Add(return_Value); 

    dataReader = this.command.ExecuteReader("dbo.SelectDays", CommandType.StoredProcedure, parameters.ToArray()); 

    if(out_recordCount.Value != DBNull.Value) 
    recordCount = Convert.ToInt64(out_recordCount.Value); 

    returnValue = Convert.ToInt32(return_Value.Value); 

    return returnValue; 
+0

你能告訴你的C#代碼?你是否將'CommandType'設置爲'CommandType.StoredProcedure'?你如何將參數傳遞給命令? – juharr

+0

也許[這](http://stackoverflow.com/questions/6374193/sql-output-stored-procedures-not-working-with-executereader)將有所幫助。 – juharr

+0

添加了C#代碼 –

回答

4

爲輸出參數的值是SQLServer的流中之後的任何結果集返回(我相信這也是返回值的真)。這意味着直到讀取DataReader中的所有行(或者我認爲關閉它)之後,纔會看到該值。因此,告訴您結果集中行數的輸出參數幾乎沒有用處。

但是,下面的代碼片段展示了你應該使用的操作順序:

using(SqlConnection connection = new SqlConnection("[your connection string here]")) 
{ 
    connection.Open(); 

    using (SqlCommand command = connection.CreateCommand()) 
    { 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "dbo.SelectDays"; 

    command.Parameters.AddWithValue("@dateStart", dateStart != null ? (object)dateStart : DBNull.Value); 
    command.Parameters.AddWithValue("@dateEnd", dateEnd != null ? (object)dateEnd : DBNull.Value); 

    SqlParameter out_recordCount = new SqlParameter("@recordCount", SqlDbType.BigInt); 
    out_recordCount.Direction = ParameterDirection.InputOutput; 
    out_recordCount.Value = recordCount; 

    command.Parameters.Add(out_recordCount); 

    SqlParameter return_Value = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); 
    return_Value.Direction = ParameterDirection.ReturnValue; 
    command.Parameters.Add(return_Value); 

    using(SqlDataReader reader = command.ExecuteReader()) 
    { 
     while(reader.Read()) { /* do whatever with result set data here */ } 
    } 

    /* Output and return values are not available until here */ 

    if (out_recordCount.Value != DBNull.Value) 
     recordCount = Convert.ToInt64(out_recordCount.Value); 

    returnValue = Convert.ToInt32(return_Value.Value); 

    return returnValue; 
    } 
} 
+0

欣賞你的時間,但我需要返回讀者。上述解決方案可以工作,但是'Read()'需要在方法之外完成。我決定分開這兩種方法。 –