2012-07-20 27 views
0

我需要將值分配給FetchSize。可以使用refelection從數據讀取器接收rowsize。我們可以將OdbcDataReader.FetchSize(= rowSize * rows)硬編碼爲固定數量的行嗎? (Oracle數據庫提供程序)

但我需要行數,我可以harcode作爲rowsize * 100000(而不是rowcount)。

executionataReader將用於多個存儲過程,無法獲取rowcount。

  OracleDataReader dr = command.ExecuteReader(); 

      Int32 rowCount = 100000; //in this case actual result will be just 20k only. will it have any issue? 

      FieldInfo fi = dr.GetType().GetField("m_rowSize", BindingFlags.Instance | BindingFlags.NonPublic); 

      Int32 rowSize = Convert.ToInt32(fi.GetValue(dr)); 

      dr.FetchSize = rowCount * rowSize; 

      while (dr.Read()) 
      { 
       string myField = (string)dr[0]; 
       Console.WriteLine(myField); 
      } 

會有什麼缺點通過修復?

回答

3

此處的FetchSize屬性限制了爲單個「提取」分配回數據庫的內存量。較小的讀取大小意味着獲取數據的更多往返行程,但也意味着在任何給定時間在客戶端上使用的內存較少。

把抓取大小設置成類似RowSize * n將告訴讀者總是在最n行一次取。如果您設置n等於RowCount,則表示「一次獲取整個結果集」。如果你設置n等於一個固定的數字,你說「一次獲取1000(或10000或25000或其他)行」。當您撥打DataReader.Read()時,數據讀取器將嘗試返回已經獲取並緩存的行。如果您要求它一次提取100,000行,則每100,000次調用一次只需與Oracle交談一次。

更高的讀取大小意味着更高效的網絡流量,更少的數據庫訪問,因此在大多數情況下通常會「更快」。但是,這意味着客戶端會使用相對較多的內存,因此如果獲取大小變得非常大,您可以運行垃圾回收和/或分頁問題。這取決於你。

請注意,指定FetchSize的值不是行大小的倍數是完全合法的,它只會導致在每次獲取時未使用剩餘的內存。如果對於具有不同行大小的多個存儲過程使用相同的Command對象,則最好先設置一個大的值(以實際字節爲單位),然後將其用於所有內容。

相關問題