2014-10-19 77 views
1

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

目前我请按照下列步骤操作:

  1. 执行存储过程
  2. 从数据集中取的结果数据集
  3. 填充列表。

有没有办法消除步骤(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); 
    } 
} 
+0

这是一个**存储过程** - 一个过程**存储**在您的数据库中。它与*商店*无关。...... – 2014-10-19 07:03:51

回答

4

是当然,你可以做到这一点 - 只要执行你的命令,并拿回读者,然后遍历结果集中的行和建立你的对象:

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在线查找大量教程和示例。

+0

这是否比我的方法更快? – 2014-10-19 07:11:13

+0

这将很难维持。在将来如果有任何列的增加/减少,reader.GetString()将需要特别注意。列的顺序也可能改变。 – 2014-10-19 07:15:51

+0

是的,这是**更快** - 基本上,这是'OleDbAdapter'在封面下做的 - 但没有任何创建'DataSet'的开销 - 只是在处理结束时抛弃它 – 2014-10-19 07:36:53