存储多行存储过程数据以便稍后在 c# 中循环遍历行
Posted
技术标签:
【中文标题】存储多行存储过程数据以便稍后在 c# 中循环遍历行【英文标题】:storing multi row stored procedure data to loop through rows later in c# 【发布时间】:2021-05-24 19:10:18 【问题描述】:我有一个将返回多行数据的存储过程。在我的示例中,我们使用了执行以下操作的 SqlDataReader:
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
conf.T_id = dr["t_id"].ToString();
conf.Cm_firstname = dr["cm_firstname"].ToString();
conf.Cm_lastname = dr["cm_lastname"].ToString();
conf.Cm_userid = Convert.ToInt32(dr["cm_userid"]);
conf.AgeOfNotification = dr["AGEOFNOTIFICATION"].ToString();
conf.DelegateSystem = dr["DELEGATESYSTEM"].ToString();
conf.P_Id = Convert.ToInt32(dr["P_id"]);
dr.Close();
但是,在我的情况下,我需要存储返回的信息并稍后遍历每一行,以使用每一行的数据调用另一个类。如何存储此信息并在以后循环访问?
我一直在尝试这样,但我在谷歌上搜索它,看起来不可能这样。
在我的 sqlUtility 类中:
DataSet spDataSet = new DataSet();
...
sqlDataAdapter.Fill(spDataSet);
connection.Close();
connection.Dispose();
returnVal.SpDataSet = spDataSet;
然后在我想遍历每一行的类中,为每一行分配变量并用它调用类:
DataSet tmpUMData = conf.SpDataSet;
//then I want to convert the DataSet to a SqlDataReader so I can loop through the rows:
??convert
//apparently can't convert like this and do like before
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
T_id = dr["t_id"].ToString();
Cm_firstname = dr["cm_firstname"].ToString();
Cm_lastname = dr["cm_lastname"].ToString();
Cm_userid = Convert.ToInt32(dr["cm_userid"]);
AgeOfNotification = dr["AGEOFNOTIFICATION"].ToString();
DelegateSystem = dr["DELEGATESYSTEM"].ToString();
P_Id = Convert.ToInt32(dr["P_id"]);
addTask(T_id,Cm_firstname,...);
dr.Close();
我看不到如何从 DataSet 转换为 SqlDataReader。看起来我需要loop through the datarows,但我无法访问行中的每个值。
foreach (DataTable table in tmpUMData.Tables)
foreach (DataRow row in table.Rows)
foreach (object item in row.ItemArray)
//I'm not sure how to get data like I do for dr.Read()
string t_id = item["t_id"].ToString(); //cs0021 cannot apply indexing with [] to an expression of type object
...
taskAdd(t_id, ...);
我没有看到任何关于如何访问每个数据项的好例子。有任何想法吗?我从 sql 查询/sp 返回的数据如下所示:
t_id cm_firstname cm_lastname cm_userid ageOfNotification DelegateSystem P_ID
12345 Joe Shmo 123 30 One 7890
23456 Yoda Creature 234 60 Other 8901
...
【问题讨论】:
既然已经将所有内容都加载到了 DataSet 中,为什么还要使用数据阅读器?事实上,当您真的想要具体对象时,为什么还要使用 DataSet?为什么不使用像 EF Core 这样的 ORM 并缓存加载的对象? 如果您不想要功能齐全的 ORM(它仍然比 Dataset 更轻量),您可以使用 Dapper 从查询结果中直接加载和映射对象 【参考方案1】:假设你的 conf 是 Conf 类的一个实例,你只需要创建一个 List 来存储数据:
public List<Conf> GetData()
.....your code
var list = new List<Conf>();
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
var conf=new Conf();
conf.T_id = dr["t_id"].ToString();
conf.Cm_firstname = dr["cm_firstname"].ToString();
conf.Cm_lastname = dr["cm_lastname"].ToString();
conf.Cm_userid = Convert.ToInt32(dr["cm_userid"]);
conf.AgeOfNotification = dr["AGEOFNOTIFICATION"].ToString();
conf.DelegateSystem = dr["DELEGATESYSTEM"].ToString();
conf.P_Id = Convert.ToInt32(dr["P_id"]);
list.Add(conf);
dr.Close();
......
return list; // for the future use
你可以这样使用它
var list=GetData();
【讨论】:
好主意。我也查看了这个链接,这有帮助。谢谢! ***.com/questions/23561375/… 稍后我试图从数据集中提取数据。当我执行 sql 查询时,将其放入列表/类中效果很好。以上是关于存储多行存储过程数据以便稍后在 c# 中循环遍历行的主要内容,如果未能解决你的问题,请参考以下文章