C# 返回一行存储过程C变量

C# 返回一行存储过程C变量,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我有一个概念上的是/否问题。我正在执行一个返回一行的存储过程。是否有一种类似于ExecuteScalar的方法允许我直接用列值填充变量?或者使用DataReader/DataGrid/Dataset是唯一的过程吗?否。无论是一行还是1000行,您或MS内部代码都将使用DataReader 如果您对超级细节超级性能感兴趣,请声明一大堆out参数,并从中进行分析 但是99%的情况下,如果您有一个名为User的类,该类的属性直接与存储过程返回的字段名匹配,那么输出参数就不值得了。如果是这种情况,那么直

我有一个概念上的是/否问题。我正在执行一个返回一行的存储过程。是否有一种类似于ExecuteScalar的方法允许我直接用列值填充变量?或者使用DataReader/DataGrid/Dataset是唯一的过程吗?

否。无论是一行还是1000行,您或MS内部代码都将使用DataReader

如果您对超级细节超级性能感兴趣,请声明一大堆out参数,并从中进行分析


但是99%的情况下,如果您有一个名为User的类,该类的属性直接与存储过程返回的字段名匹配,那么输出参数就不值得了。如果是这种情况,那么直接从示例中


我想没有比这更好的了。它是标量或表,没有行。我认为DataReader是最好的选择。执行单个读取方法将为您提供所有行的值,您是否有权访问EntityFramework或其他ORM?关键点是:是否要在自己类的实例上设置属性?如果是,那么您也可以考虑每个值的输出参数,以避免读取器的开销。实用性取决于输出中有多少列。我选择这个答案而不是史蒂夫的答案,因为这证实了我的问题是基于我的技能水平。随着我的技能/知识的提高,我希望学习如何实现Steve的答案。非常感谢。
public class User
{
    public int UserID {get;set;}
    public string Account {get;set;}
    public string Pass {get;set;}
    ......
}

using(SqlConnection cnn = GetConnection())
{
    User u = cnn.Query<User>("spGetUser", new {Id = 1}, 
              commandType: CommandType.StoredProcedure).First();

    ......
}