我正在使用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?
答案 0 :(得分:1)
您可以通过指定value
这样的columns
来阅读多个index
中的int totalColumns = reader.FieldCount;
for(int i=0;i<totalColumns;i++)
{
var label = reader.GetValue(i);
}
GetValue
您可以通过循环列来选择所有列的值。
int
将argument
作为index
,index 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);