2010-09-12 50 views
8

我只是想知道,我有什麼東西從數據庫中獲取數據,並使用的DataReader和DataAdapter時要考慮什麼這兩名DataReader的之間的差別需要打開的連接和datadapter不...在我們的項目中,在我們所有的DAL中使用DataReader,我們從不使用dataadapter。所以我想知道什麼情況下使用DataAdapter + Datatable組合比使用DataReader更好。提前致謝。ADO.NET問題:當使用的DataReader,DataAdapter的

回答

3

在做ADO.NET的時候,我幾乎總是喜歡DataReader;原因是,它不會強制您將數據存儲在客戶端上的時間不再超過您的要求。

這也是什麼時候對數據集/表使用DataAdapter的答案;當你想將數據存儲在客戶端時,或許可以以某種方式使用它 - 從頭到尾迭代或作爲一組進行操作,而不是簡單地將值輸出到網格中,其中讀取器,IMO,是一個更好的選擇。

7

的DataReader:這是最好的使用,當你只是想獲取在readony模式數據,填寫您的企業實體,並關閉讀卡器。這真的很快。

說假設,你有一個客戶類,你想與所有客戶填寫的屬性完全一樣的對象initilized(姓名,地址等)

您將在這裏使用的DataReader,只是填充實體並關閉閱讀器。

您無法使用datareader進行更新。

DataAdapter:您可以使用dataadapters讀取/更新數據,但在讀取數據和Datareader時速度會更快。

您可以更新的DataAdapter的數據,但在讀者你不會

1

我有什麼事情DataReader的使用和DataAdapter時 考慮

DataReader的:良好的低層次的接口。 PRETty只有一個接口 - 如果你將數據加載到更高級的結構中,實際的加載總是使用DataReader完成的。

的DataAdapter /數據集:東西不使用誰喜歡結構p rograms和漂亮的代碼,不只是發生在編寫報告的applcation人。使用ORM - NHipernate(好),Linq2SQL(壞),實體框架(壞)或其他更好的抽象。

3

DataReader讓你處理每個記錄,並把它扔掉,當你要處理大量的數據記錄,沒有彼此相關,這是很好。例如,如果要計算數據庫中每個記錄的某個複雜統計值,或者將大量數據記錄保存到本地文件中,則可以使用DataReader

DataAdapter是別的東西,它能夠讓你在內存中的數據記錄。這使您可以使GUI瀏覽數據,編輯數據等。它更一般,但對大數據集不適用。

+0

數據適配器可以是一個不錯的選擇將數百萬條記錄(例如:我的數據表中有2-3百萬條記錄)轉儲到數據庫中的情況? – 2016-06-20 09:58:46

3

您只想在使用DataSet時使用DataAdapter。
一個適配器有兩個主要方法Fill()Updater()來讀取數據集並將其寫入數據庫。

請注意Fill()將打開一個Connnection,使用DataReader獲取所有記錄,然後關閉連接。

如果沒有數據集和數據表,您沒有DataAdapter的用法。

所以真正的問題是:你想在你的DAL中使用什麼類型的存儲類? DataSets是可行和簡單的,但它是一種老化的技術(不再改進)。

也許你應該看看ORM(對象關係映射)庫。但是,這將用更復雜的選擇來替代DataReader/Adapter問題。

+0

在將數百萬條記錄(例如:我的數據表中有2-3百萬條記錄)存入數據庫的情況下,data dapater可以作爲一個不錯的選擇嗎? – 2016-06-20 09:48:36

+2

試試吧,涉及的因素太多。另外,不要在評論中提問,這不是論壇。尋找現有的,否則使用詢問按鈕。 – 2016-06-21 20:18:30

+0

你能幫我解決這個問題:http://stackoverflow.com/questions/37970073/getting-error-while-inserting-datatables-records-in-my-database-table – 2016-06-22 15:21:21

2

從來沒有使用DataReader。

由於我強烈地對我的應用程序進行分層,我的DAL負責與數據庫交談,我的BLL負責構建對象,因此BLL在完成時無法關閉DataReader。相反,BLL從DAL請求DAL執行的DataSet/DataTable。它通過執行Fill(TomTom的要點>查看堆棧跟蹤,是的,你會在那裏看到一個DataReader)。 BLL然後做它喜歡的結果集。

+0

-1:這不回答這個問題。 OP沒有要求替代DataReader和DataAdapter。 – 2010-09-16 16:06:19

+1

我不同意:他問「使用DataAdapter + Datatable組合比使用DataReader更好」是什麼情況?我回答了(或者至少對討論做出了貢獻),給出了我設計事物的方式的描述。如果我描述的設計聽起來像他的應用程序,那麼我建議在DataReader上使用DataAdapter將是有效的。順便說一下,我不是在調用DataReader。我個人從來沒有理由使用它,除非我從表示層調用數據庫,我不這樣做。請重新考慮你的倒票。 – Brad 2010-09-16 16:16:48

0

我想這個問題只是說說proc和缺點,以及被關閉端的代碼

*數據讀取器在讀取數據比DataAdapter的快得多,但你必須知道什麼是確切斷開模式

* DataReader或連接模式和DataAdapter斷開連接模式正用於相同的場景,但有些時候斷開連接模式更適合您的數據方式

*但Disconnectiod模式提供了豐富的API,如DataAdapter ,DataView,DataTable和DataSet。功能強大的是你只需使用SELECT,INSERT,UPDATE,DELETE命令,從單個表或多個表中爲你的DataAdapter提供數據,並使用一行代碼Adapter.Fill(DataTable)或Adapter.Fill(DataSet)和與更新數據Adapter.Update(數據表)同樣的方式

*在離線模式更新分層數據遠遠高於其必須使用額外的代碼和額外的邏輯來保持連接模式更好的工作,在離線模式下,你有能力旁邊的更新操作被包裹點淨交易 Adapter.Update內更新只有插入行或更新的行或刪除行(DataTable.Select(「」,「」,DataViewRowState.Added))

*在你有斷開模式能力得到v *您的數據中的每一行都有一行,除此之外您可以對數據進行更改DataTable.GetChanges()

*斷開連接模式爲您提供了強類型數據集,因此您可以獲取數據定義模式和關係,您可以獲取父類和子行

*斷開連接模式提供了通過PrimaryKey獲取行的方法,該方法還獲取具有特定標準DataTable的行。選擇(「FilterExpression」,「SortOrder」,DataRowViewState)

*您可以通過DataTable進行計算,並且不要打擾您的服務器,如選擇productID,ProductName,Price,Quantity,price * quantity as Total,容易與特定的標準(價格*數量)

添加列*您可以聚合或你搶去的DataTable,DataTable.Compute( 「總和(價格)」, 「價格> 250」)

*斷開模式你有CommandBuilder它爲你創建sqlcommands,但它只能用於單個表