2017-10-04 99 views
0

我使用它从DataReader的读取数据,并添加列表中的一个对象列表类型为项目分配值。 下面是相同的代码:添加项目,然后在列表

public static List<object[]> LoadRecordsFromDataReaderToList(SqlDataReader reader, int dataLimit) 
{ 
     List<object[]> dataList = new List<object[]>(); 
     while (reader.Read()) 
     { 
      object[] columnName = new object[reader.FieldCount]; 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       columnName[i] = reader.GetName(i); 
      } 
      dataList = new List<object[]>{columnName}; 
      object[] tempRow = new object[reader.FieldCount]; 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       tempRow[i] = reader[i]; 
      } 

      dataList.Add(tempRow); 
     } 
     return dataList; 
    } 

正如你可以看到上面的代码先运行一个for循环得到所有列在列表中指定类似下面的图像。 List with column name image

然后运行一个多回路获得的价值,并试图指派为相同的列名,但后添加tempRow列表显示两个项目计算,所有的列名,并与所有的值第二项第一项。 以下是为所有值添加的图像。 List with added values

我如何在列表中选择特定的列索引值分配? 请让我知道如果你有任何问题。

+0

的'while'是遍历每个记录在第一循环读者。在那里,你随时添加所有列名 –

+0

@TimSchmelter,能否请你指正我在做什么错在那里? –

回答

0

似乎要列名添加为“头”,在while循环一次,并非总是如此。 你总是在改写记录中环的整个列表:

dataList = new List<object[]>{columnName}; 

我认为你可以使用这种方法:

public static List<object[]> LoadRecordsFromDataReaderToList(SqlDataReader reader) 
{ 
    List<object[]> dataList = new List<object[]>(); 

    if (reader.HasRows) 
    { 
     // add header first and just once 
     string[] columns = Enumerable.Range(0, reader.FieldCount) 
      .Select(reader.GetName) 
      .ToArray(); 
     dataList.Add(columns); 
    } 

    while (reader.Read()) 
    { 
     // add data records 
     object[] tempRow = new object[reader.FieldCount]; 
     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      tempRow[i] = reader[i]; 
     } 
     dataList.Add(tempRow); 
    } 
    return dataList; 
} 
+0

我已经检查给定的代码但是我就是在DataList控件添加temprow后看到我有两个项目计数。一个是字段的字符串数量,另一个是对象数量的值。我需要在这里为每个专栏项目也应该有它们的价值。就像我们如何使用List userDetailsList = new List ();其中Report_UserDetails对象我们有适当的名字。当为此列表值添加值时,将为特定属性设置值。希望你明白我想说什么。 –