2012-02-28 89 views
1

我必須讀取大約100列的sql表格,然後檢查每個單元格以驗證數據是否爲空。使用SQLReader時,它會在第70列拋出一個IndexOutOfBoundsOfArrway異常。任何想法如何讓我達到我的目標? P.S.我在C#這樣sql大數據讀取

這是我的代碼:

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

+1

你確定它確切地是100列嗎?因爲這個錯誤應該表示該列是69(我認爲)。你有沒有檢查Property FieldsColumn,以確切知道DataReader公開的列是否?對於應該是這樣的:for(int i = 0; i 2012-02-28 13:49:57

+1

您還應該考慮閱讀[SqlParameter](http://www.dotnetperls.com/sqlparameter) – Shai 2012-02-28 13:50:28

+2

'if (reader [i] .ToString'...應該是'if(reader [i]!= null' – Kane 2012-02-28 13:51:46

回答

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());  
    } 
} 

您可能還需要考慮將空退房實際讀取過程的,因爲通過列循環需要相當長的時間,並在您這樣做時阻止讀者。

但是,根據行數的不同,您可能會在內存消耗方面帶來新的挑戰。

UPDATE
爲了避免由索引分別檢索每個列中,使用DataReader代替返回所有值的對象陣列,也如果預計只有一行的GetValues()分批操作中,如果不是使用同時爲了避免問題:

if (reader.Read()) 
{ 
    var values = new object[reader.FieldCount]; 
    reader.GetValues(values); 

    for (int i = 0; i < values.Count ; i++) 
    { 
    if (values[i] == null) 
     continue; 
    listBox2.Items.Add(values[i].ToString());  
    } 
} 
+0

我總是隻讀一行,我從3個字母欄開始0,1和2有一些與其他地方一起工作的ID值......如果我有太多的可能性列,sqlDataReader被限制在前70列? – Jaws 2012-02-28 14:17:45

+0

這取決於何時發生異常。如果在'reader.Read()'行中引發異常,而不是問題似乎是某種限制DataReader,但是如果代碼稍後在代碼中出現異常,讀者已經持有dat在內部數組中,所以問題將不得不在你的代碼中。但是據我記得,我從來沒有遇到過DataReader中的列限制,而且我曾經在類似的大表中工作過。 – ntziolis 2012-02-28 14:23:25

3

一個DataReader有以下屬性欄 信息:

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

使用它,首先檢查你得到100列與否。

閱讀:SqlDataReader.FieldCount Property

0

在每一行做一個for循環相反的,你可以做,而不是一個foreach所行中的每一列。 這將防止此問題,並且列計數不會硬編碼到您的代碼中。