将存储过程结果填充到 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>的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Dapper 将 list<myobject> 作为参数插入到存储过程