C#-使用SqlDataReader读取过程的输出参数[duplicate]

问题描述 投票:0回答:1

我有以下情况:我有一个接受一定数量参数的过程,在本例中,我将其称为过程“ sp_dosomething”,该过程接受@paramA, @paramB作为其输入参数,而接受@paramC作为其输出参数,因此,我们将拥有的SQL:

exec sp_dosomething      @paramA = @paramA
                       , @paramB = @paramB 
                       , @paramC = @paramC  output

到目前为止,很好,该过程返回一组记录,为此示例假设100条记录。在下面,您可以看到该代码实际读取该过程返回的记录集:

        using (var sqlConnection = _myfactory.CreateSqlConnection(_connectionString))
        {
            sqlConnection.Open();
            using (var sqlCommand = _myfactory.CreateCommand(sqlConnection, _myfactory.GetParameters(procedureParameters)))
            {
                var dataReader = sqlCommand.ExecuteReader();
                while (dataReader.Read())
                {
                    // here I'd read the 100 records that the procedure returns.
                }
            }
        }

现在出现问题:如何从上面代码的@paramC中获取值?到目前为止,我已经尝试过:

sqlCommand.Parameters["@paramC"].Value;

sqlCommand范围内和在[while (datareader.Read())]范围内,均不成功,因为它总是返回null。我知道我可以在[sqlCommand.ExecuteNonQuery()]语句之前调用while (datareader.Read())并检索输出参数,但是我想知道是否有任何方法可以实现而无需再次调用数据库。换句话说,同时检索记录集和过程的输出值。

@解决方案(来自下面的评论):

解决方案的一个例子是:

using (var sqlConnection = _myfactory.CreateSqlConnection(_connectionString))
    {
        sqlConnection.Open();
        using (var sqlCommand = _myfactory.CreateCommand(sqlConnection, _myfactory.GetParameters(procedureParameters)))
        {
            var dataReader = sqlCommand.ExecuteReader();
            while (dataReader.Read())
            {
                // here I'd read the 100 records that the procedure returns.
            }
            dataReader.Close(); //or surround dataReader with using statement.     
            var myOutputValue = sqlCommand.Parameters["@paramC"].Value;           
        }
    }
c# .net sql-server .net-core sqldatareader
1个回答
0
投票

添加具有输出方向的命令参数。

using (var sqlCommand = _myfactory.CreateCommand(sqlConnection, _myfactory.GetParameters(procedureParameters)))
        {
            sqlCommand.Parameters.Add("@paramC", SqlDbType.VarChar, 100);  
            sqlCommand.Parameters["@paramC"].Direction = ParameterDirection.Output; 
            var dataReader = sqlCommand.ExecuteReader();
            while (dataReader.Read())
            {
                var paramC= Convert.ToString(cmd.Parameters["@paramC"].Value);
            }
        }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.