sql大数据读取

时间:2012-02-28 13:45:18

标签: c# sql

我必须读取一个包含大约100列的sql表,然后检查每个单元格以验证数据是否为空。使用SQLReader,它会在第70列引发一个IndexOutOfBoundsOfArrway异常。任何想法我如何达到我的目标? 附:我在c#

中这样做

这是我的代码:

conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand( "select * from tableName where column1='" + 
                                 textBox1.Text+"'", conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
   for (int i = 3; i < 100; i++)
   {
      if (reader[i].ToString() != "")
      {
          listBox2.Items.Add(reader[i].ToString());
      }

    }
 }

编辑:我确定我的表有100列,但是reader.FieldCount等于70

3 个答案:

答案 0 :(得分:3)

DataReader具有以下属性列 信息:

FieldCount - returns the number of columns in the result set.

使用它并首先检查你是否有100列。

阅读: SqlDataReader.FieldCount Property

答案 1 :(得分:2)

尝试这种更加动态的方法,无论列数多少都可以使用:

while (reader.Read())
{
   // not sure  why you started at 3, 
   // this code is generic so it will also work for tables with less that 3 columns
   // but maybe that is something you can omit
   for (int i = 0; i < reader.FieldCount ; i++)
   {
      if (reader[i] == null)
         continue;

      listBox2.Items.Add(reader[i].ToString());      
   }
}

您可能还需要考虑将空检查移出实际的读取过程,因为循环遍历列需要相当长的时间,并且在您这样做时阻止读者。

但是,根据行数的不同,您的读数可能会在内存消耗方面带来新的挑战。

<强>更新
为了避免通过索引单独检索每个列,请使用GetValues()的{​​{1}}批处理操作,而不是返回所有值的对象数组,如果您只想要一行,则使用if而不是while避免问题:

DataReader

答案 2 :(得分:0)

而不是在每一行上执行for循环,而是可以在行中的每一列上执行foreach。 这样可以防止出现此问题,并且列数不会硬编码到您的代码中。