2014-10-19 25 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