存储多行存储过程数据以便稍后在 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# 中循环遍历行的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在同一存储过程中并行处理for循环?

mysql存储过程 使用游标实现两张表数据同步数据

pl/sql 循环遍历表并将行的每个条目传递给存储过程

使用存储过程(SQL + C#)将数据插入一个表,然后将多行插入另一个表

使用 C# 在 oracle 数据库中更新多行的最佳方法

循环遍历所有 SSMS 数据库而不重新创建存储过程