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