2015-08-17 27 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()'需要在方法之外完成。我决定分开这两种方法。 –