2

在我的代码的一部分中,我使用 DataTable 和 DataTableReader 从我的 SQLite 数据库中获取信息并将其添加到列表中。当程序到达 reader.GetValue 行时,程序会抛出 ArgumentOutOfRangeException。据我所知,没有理由发生这种情况。

    DataTable dt = db.GetDataTable(Program.CONN, "SELECT ID FROM table WHERE column LIKE 'False%'");
    using (DataTableReader dtr = dt.CreateDataReader())
    {
         while (dtr.Read())
         {
              int rt = 0;
              foreach (DataRow dr in dt.Rows)
              {
                   string line = dtr.GetValue(rt).ToString();//Arguement out of range exception being thrown here
                   idList.Add(line);
                   rt++;
              }
          }
     }
4

2 回答 2

3

您正在遍历行,而不是列。你应该做 :

DataTable dt = db.GetDataTable(Program.CONN, "SELECT ID FROM table WHERE column LIKE 'False%'");
int count = dt.Columns.Count;
using (DataTableReader dtr = dt.CreateDataReader())
{
    while (dtr.Read())
    {
        for (int rt = 0 ; rt < count ; rt ++)
        {
            string line = dtr.GetValue(rt).ToString();
            idList.Add(line);
        }
     }
}

或者 :

DataTable dt = db.GetDataTable(Program.CONN, "SELECT ID FROM table WHERE column LIKE 'False%'");
using (DataTableReader dtr = dt.CreateDataReader())
{
    while (dtr.Read())
    {
        foreach (DataColumn col in dt.Columns)
        {
            string line = dtr[col.ColumnName].ToString();
            idList.Add(line);
        }
    }
}
于 2014-01-15T14:36:17.070 回答
0
int fc = dataReader.FieldCount;
while (dtr.Read())
{
  for (int rt = 0 ; rt < fc ; rt ++)
  {
     if (fc > rt)
     {
         if (!(dtr.IsDBNull(rt)))
         {
            string line = dtr.GetValue(rt).ToString();
            idList.Add(line);
         }
      }
   }
}
于 2014-01-15T14:33:17.633 回答