将存储过程结果填充到 List<T>

Posted

技术标签:

【中文标题】将存储过程结果填充到 List<T>【英文标题】:Populate stored procedure result to a List<T> 【发布时间】:2014-10-19 06:57:33 【问题描述】:

有没有办法将存储过程的结果映射到通用列表而不是数据集/数据表?

目前我遵循以下步骤:

    执行存储过程 在数据集中获取结果 从数据集中填充列表。

有没有办法消除步骤(2)。

OleDbCommand cm = new OleDbCommand();
cm.Connection = AccessConnection();
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "seltblContacts";

OleDbDataAdapter adp = new OleDbDataAdapter(cm);

DataTable dt = new DataTable();
adp.Fill(dt);

List<tblContacts> LstFile = new List<tblContacts>();

if (dt.Rows.Count > 0)

    tblContacts t;

    foreach (DataRow dr in dt.Rows)
    
        t = PopulateContacts(dr);
        LstFile.Add(t);
    

【问题讨论】:

这是一个存储过程 - 一个存储在您的数据库中的过程。它与 store .... 无关 【参考方案1】:

是的,您当然可以这样做 - 只需执行您的命令并取回 阅读器,然后遍历结果集中的行并构建您的对象:

using (OleDbCommand cm = new OleDbCommand())

     cm.Connection = AccessConnection();
     cm.CommandType = CommandType.StoredProcedure;
     cm.CommandText = "seltblContacts";

     List<tblContacts> LstFile = new List<tblContacts>();

     using (OleDbReader reader = cm.ExecuteReader()) 
     
        while(reader.Read())
        
            tblContacts contact = new tblContacts();

            // here, set the properties based on your columns from the database
            contact.FirstName = reader.GetString(0);    
            contact.LastName = reader.GetString(1);
            // etc.

            LstFile.Add(contact);
        

        reader.Close();
     

     return LstFile;    

有关OleDbReader 的详细信息以及如何使用它,see this other SO question 或使用 Bing 或 Google 在线查找大量教程和示例。

【讨论】:

这比我的方法快吗? 这将很难维护。将来如果有任何列的加/减,reader.GetString() 将需要特别注意。列的顺序也可能发生变化。 是的,这是 MUCH 更快 - 基本上,这就是 OleDbAdapter 在幕后所做的 - 但没有任何创建 DataSet 的开销 - 只是在处理结束时将其丢弃 是的,这需要大量维护。如果您想避免这种情况,请使用基本上为您完成所有这些工作的 ORM(如实体框架),而您不必编写(和维护!)该代码! 仅供参考,IDbDataReader 有一个基于列 (reader["fieldName"]) 的字符串索引器,因此无需根据数字索引访问字段。

以上是关于将存储过程结果填充到 List<T>的主要内容,如果未能解决你的问题,请参考以下文章

将List进行分组后结果返回Map结果集

oracle存储过程:将select查询的结果存到变量中

List<T> 填充集合性能

如何使用 Dapper 将 list<myobject> 作为参数插入到存储过程

在 c# 中使用 SqlDataReader 填充 List<T>

将 List<> 传递给 SQL 存储过程