2014-02-28 19 views
0

我可以將我的SQL結果集存儲到ADODB記錄集或ADO.NET記錄集中。在.NET 我可以使用.NET連接管理器,獲取.NET數據集,從這個DataSet中提取數據表並從中使用它。問題是我在記憶中獲得大約30-40K行。 我不想那樣做。我想將SqlDataReader變成「某種.NET記錄集」 ,這樣我就可以逐行讀取,而不是一次全部讀取。我如何做到這一點?我只想使用C#和.NET。在執行SQL任務中獲取SqlDataReader而不是RecordSet

謝謝。

回答

2

.NET提供了幾種類型集合列表中,一個HashSet ....
所有這些都將保留在內存中記錄
DataTable中有許多功能和內存開銷

創建適當的類物業

List<MyClass> MyClasses = new List<MyClass>(); 

String strSQL = "select * from Table01"; 
SqlCommand cmd = new SqlCommand { Connection = Cn, CommandText = strSQL }; 
try 
{ 
    Cn.Open(); 
    SqlDataReader sdr = cmd.ExecuteReader(); 
    while (sdr.Read()) 
    { 
     MyClasses.Add(new MyClass(sdr.GetValue(0)); 
    } 
    sdr.close();  
} 
catch (Exception Ex) {} 
finally 
{ 
    Cn.Close(); 
} 

30-40K並不是那麼大,除非你的行很大。
我已經使用超過100萬的收藏。

0
SqlDataReader sdr; 
var strSQL = "select * from Table01"; 
var cmd = new SqlCommand { Connection = Cn, CommandText = strSQL }; 
try 
{ 
    sdr = cmd.ExecuteReader(); 
    sdr.Read(); 
    if (sdr.HasRows) 
    { 
     var field = sdr.GetValue(0); 
     // and so on.... 
    } 
    dtrContID.Close(); 
} 
catch (Exception err) 
{ 
    // ....... 
} 
+0

這是一個有點晚優勢排處理數據行在讀取之後測試HasRows。這隻會讀一行。 – Paparazzi

1

如果您想通過行處理您的數據行,這一切無法加載到內存中,然後你爲什麼不編寫自定義轉換:這裏是東西給你一個想法:http://technet.microsoft.com/en-us/library/ms136027.aspx

使用現有的連接管理器的源和目標,並將腳本組件置於您的自定義行之間進行處理。

這將通過它使用所有的SSIS原生能力(在不需要的時候再和回退)僅排的最佳量轉移到內存緩衝區