如何将DataReader中的值放入List <t>?</t>

时间:2011-05-18 09:18:51

标签: c# .net ado.net

  

可能重复:
  How can I easily convert DataReader to List<T>?

我想将来自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;
         }
     }
 }

3 个答案:

答案 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)。