我想将来自datareader对象的数据放在通用列表中。我这样做了但是它不起作用......
我在foreach行中遇到强制转换异常错误!
SqlDataReader pointreader = cmd2.ExecuteReader();
var pointt = new List<int>();
while (pointreader.Read())
{
foreach (int item in pointreader)
{
pointt.Add(item);
if (pointt.Contains(point))
{
matchpoint = item;
}
}
}
答案 0 :(得分:8)
无法以您描述的方式访问SqlDataReader,因为它未实现IEnumerable。相反,您需要单独访问每个字段:
SqlDataReader puanoku = cmd2.ExecuteReader();
List<int> puann = new List<int>();
while (puanoku.Read())
{
for (int i = 0; i < puanoku.FieldCount; i++)
{
if (puanoku.GetFieldType(i) == typeof(int))
{
// Do something here
}
}
}
如果您只选择了一列并且确定它是一个int,那么您可以像这样简化代码:
SqlDataReader puanoku = cmd2.ExecuteReader();
List<int> puann = new List<int>();
while (puanoku.Read())
{
int value = puanoku.GetInt32(1);
// Do something with the int here...
}
此article可能有用。
答案 1 :(得分:3)
我认为您需要从Reader中获取项目,例如puanoku["item"]
并将其转换为int。添加然后只能将其添加到列表中。
while(Reader.Read())
{
var myId = (int)Reader["myId"];
myIdList.Add(myId); // or you can do myIdList.Add(int)Reader["myId"]);
}
答案 2 :(得分:0)
datareader是指向表中行的指针。您可以使用阅读器上的索引器获取各个属性,并使用FieldCount
属性来获取值。
while (puanoku.Read())
{
for(int i = 0; i < puanoku.FieldCount)
{
puann.Add(puanoku.GetInt32(i));
}
}
如果你只想要唯一值,你应该使用HashSet而不是List,因为它将测试O(1)中的存在而不是O(n)。