存储多行存储过程数据以稍后在 c# 中循环遍历行

时间:2021-02-22 14:19:29

标签: c# sql datatable

我有一个将返回多行数据的存储过程。在我的示例中,我们使用了执行以下操作的 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
...

1 个答案:

答案 0 :(得分:0)

假设你的 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();