我必须读取一个包含大约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
答案 0 :(得分:3)
DataReader具有以下属性列 信息:
FieldCount - returns the number of columns in the result set.
使用它并首先检查你是否有100列。
答案 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。 这样可以防止出现此问题,并且列数不会硬编码到您的代码中。