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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#-使用SqlDataReader读取过程的输出参数[duplicate]相关的知识,希望对你有一定的参考价值。

我有以下情况:我有一个接受一定数量参数的过程,在本例中,我将其称为过程“ 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;           
        
    
答案

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

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);
            
        

以上是关于C#-使用SqlDataReader读取过程的输出参数[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章

从 SqlDataReader 读取数据

C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用

使用 SQLDataReader 读取 IP 地址

如何在 JavaScript 中使用 C# SQLDataReader 对象

如果 SqlDataAdapter 内部使用数据读取器,为啥人们说使用 SqlDataReader 更快?

无法读取 SqlDataReader 对象