2014-04-01 47 views
0

VB.NET 2010 框架3.5動態地從OracleDataReader

保存查詢結果我查詢表,其中的模式也不是一成不變的。字段的數量可以從一天到下一天改變。通常我會爲每個字段創建一個包含屬性的類,然後循環訪問OracleDataReader並使用數據庫中的值填充類的列表。斷開與數據庫的連接,讓OracleDataReader超出範圍,並有一個很好的代表查詢中數據的對象列表。

我的問題是這個表的模式是動態的。其他人可以在此表中創建和刪除字段。我需要一種方法來查詢表格並以某種動態數據結構「保存結果」,我更喜歡使用vb.net(t)Class(System.Collections.Generic)列表,因爲這就是我的做法這在應用

+1

所以,只要明白了,你正在做的做的相當於'SELECT * FROM mytable'和要存儲對象的架構以及其中的內容該對象的列表,但模式可以在一天之內改變到下一個?你說你在你的應用的其他部分這樣做...你怎麼在那裏做到這一點? –

+0

是它的一個SELECT * FROM表。 。我只需要存儲查詢的結果,但我並不總是知道會有多少字段會回來 – Rose

+1

我可以告訴你我是如何做過一次的,但我絕對不會說這是最好的方式(因此發佈它爲一個評論而不是一個解決方案) - 我創建了一個Dictionary(字符串,MyObject)',其中鍵是字段名,第二個是存儲值數據類型的小對象,等等......因爲你輸了很多提前瞭解領域的能力,但這確實起到了一定的作用。作爲另一種解決方案,我經常使用直接的DataTable來直接存儲數據,但它有相同的限制......無論哪種方式,希望這裏有人有更好的解決方案。 –

回答

1

你可以做一個循環對所有列:

Dim dr as OracleDataReader 

dr = ... 
For i as Integer = 0 to dr.FieldCount -1 Loop 
    Debug.Print("Column " & i & " is " & dr.Item(i).ToString) 
Next 

然而,這段代碼沒有進行測試,我不知道這是否與OracleDataReader工作。也許你不得不使用OracleDataAdapterDataTable代替:

Dim dt as New DataTable 
Dim da as OracleDataAdapter 

da = ... 
da.Fill(dt) 

For i as Integer = 0 to dt.Columns.Count - 1 Loop 
    Debug.Print("Column " & i & " is " & dt.Columns(i).Caption) 
Next 
1

我能想到做這樣的事情的唯一途徑的其他部分是:

CREATE TABLE tmp1 AS SELECT * FROM perm_table 

這將是生存系統崩潰/關機,並能夠繼續向後的唯一途徑。
當你完成它時,你也必須刪除表格(執行表GC)...

有一些.net對象可以方便你的內容,如果你想讓它留在內存中 - DataTable是最常用的一個。

和最後一件事 - 您可以動態從user_tab_columns獲取表結構,並將您的代碼調整到特定的列結構。您只需使用通用對象來表示數據,或者編寫應用程序以處理空值和結構版本。

我推薦這種方法 - 因爲有了它你努力工作,一次,並不需要甚至認爲這個問題在未來的(和不需要的數據庫來管理什麼...)