如何从DataReader加载列数据?

时间:2015-11-19 11:26:16

标签: c# asp.net

我正在使用EF7将应用程序移植到ASP.Net 5.0,并发现了一些问题。其中一个问题是MS已经删除了DataTable。我正在尝试传输一些代码,以便不使用DataTable,而是从SQLDataReader读取并将其记录到我拥有的实体中。我必须按列读取数据,但看起来像datareader只能读取一次。

旧代码:

           Series[] arrSeries = new Series[dt.Columns.Count - 1];

                IList<Categories> arrCats = new List<Categories>();
                Categories arrCat = new Categories();


                foreach (DataColumn dc in dt.Columns)
                {
                    var strarr = dt.Rows.Cast<DataRow>().Select(row => row[dc.Ordinal]).ToList();
                    if (dc.Ordinal == 0)
                    {
                        arrCat.category = strarr.Select(o => new Category { label = o.ToString() }).ToList();
                    }
                    else
                    {
                        Series s = new Series()
                        {
                            seriesname = dc.ColumnName,
                            renderas = null,
                            showvalues = false,
                            data = strarr.Select(o => new SeriesValue { value = o.ToString() }).ToList()
                        };

                        arrSeries[dc.Ordinal - 1] = s;
                    }
                }

                arrCats.Add(arrCat);

                MultiFusionChart fusChart = new MultiFusionChart
                {
                    chart = dictAtts,
                    categories = arrCats,
                    dataset = arrSeries
                };
                return fusChart;

新代码:

                    Series[] arrSeries = new Series[colColl.Count - 1];

                    IList<Categories> arrCats = new List<Categories>();
                    Categories arrCat = new Categories();
                    arrCat.category = new List<Category>();

                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        Series s = new Series()
                        {
                            seriesname = reader.GetName(i),
                            renderas = null,
                            showvalues = false
                        };

                        while (reader.Read())
                        {
                            if (i == 0)
                            {
                                Category cat = new Category();
                                cat.label = reader.GetValue(i).ToString();
                                arrCat.category.Add(cat);
                            }
                            else
                            {

                                SeriesValue sv = new SeriesValue();
                                sv.value = reader.GetValue(i).ToString();
                                s.data.Add(sv);

                                arrSeries[i - 1] = s;
                            }
                        }

                    }

                    arrCats.Add(arrCat);

                    MultiFusionChart fusChart = new MultiFusionChart
                    {
                        chart = dictAtts,
                        categories = arrCats,
                        dataset = arrSeries
                    };
                    return fusChart;

代码工作的地方,它为Series返回null。我相信这是因为读者在录制类别时走到了尽头。据我所知,无法重置DataReader?

有没有办法将列数据从DataReader加载到List?或者在这个例子中我可以用其他方式替换DataTable?

2 个答案:

答案 0 :(得分:1)

您可以通过指定value这样的columns来阅读多个index中的int totalColumns = reader.FieldCount; for(int i=0;i<totalColumns;i++) { var label = reader.GetValue(i); }

GetValue

您可以通过循环列来选择所有列的值。

  

int argument作为indexindex of row列不是function fn1 { file=$HOME/$1*.cfg echo $file } touch $HOME/abc-def.cfg fn1 abc

答案 1 :(得分:0)

问题出在你的for循环中。首先,当你的i为0时,你已经初始化了一个'Series`对象S.之后,

while (reader.Read())

将读取您的整个阅读器,而您的i仍将为零。只有

if(i == 0)

条件将返回true并且您的整个读者将被花费。之后,对于i> = 1,

while (reader.Read())

将始终返回false,保持数组 arrSeries 为空。删除while循环并使用索引

直接从dataReader读取值
reader.GetValue(i);