|
本文想借用故事的方式來說一下ADO.NET的工作方式。雖然現在都ORM了,但是了解一下ADO.NET還是有必要的。
在茫茫的大海上有許多的島,其中一個島的名字叫做“應用程序島”。這座島上商業非常發達,高樓大廈、店鋪林立。但是島的面積不夠大,沒有地方建立倉庫。所以市長決定,把臨近的一座小島開發出來,專門作為數據倉庫來使用,這座島的名字就叫“數據庫島”。
市長在數據庫島上面建立了一個MSSQL數據庫,這樣各個商場、超市就可以把自己的貨物放進去了。兩個島相鄰很近,為了便于運輸,所以直接在兩個島之間建立了五座大橋。并且成了一個“數據訪問池”的部門來專門管理這五座橋。
有一個叫command的家伙很聰明,覺得商機來了,于是他就成立了一家Command物流公司,專門負責兩座島之間的貨物運輸。物流公司成立了幾個下屬部門:Connection、DataReader。Connection負責與連接池的聯系,申請大橋的臨時使用權,并且還要提供車輛。DataReader負責裝卸貨物。
好了,萬事具備只欠東風。物流公司成了好了之后就坐等客戶上門了。不久來了一位客戶,是島上的一個書店,他們購進了一批圖書,需要送到數據庫島的倉庫里。
【添加記錄的情況】
Command接到了這個任務很高興,終于開張了。領導當然不能自己親自去干活了,于是派出了明星員工cm007來負責這個任務。
SqlCommand cm007 = new SqlCommand();
Cm007從書店那里得到了指令(就是SQL語句)和貨物,來到Connection部門。
cm007.CommandText = "";
Connection部門派出了得力員工cn007
SqlConnection cn007 = new SqlConnection();
cm007.Connection = cn007;
cn007開著車,帶著cm007來到了大橋,由cn007和連接池聯系,想要申請一座大橋的臨時使用權。
cn007.Open();
連接池得到了這個申請之后,查看了一下大橋的使用情況,現在五座大橋都沒有人使用,于是把001號大橋的使用權交給了cn007。這個時候,這座001號大橋就由cm007他們獨占了,其他任何人都不可以使用。而且是按照獨占時間來收取費用的。
一行人通過001號大橋來到了數據庫,cm007把指令交給了數據庫管理員開始交貨。數據庫管理員按照指令,把貨物放到了指定的位置。辦好之后cm007帶著數據庫的確認證明,從大橋返回到了應用程序島。離開大橋后,cn007又給連接池發了一個申請。
cn007.Close();
連接池得到了這個申請后,收回了001號大橋的使用權,這樣其他人就又可以使用這個大橋了。
cm007一行人來到了書店,把數據庫管理員的證明交給了書店,客戶很滿意,這個任務也就完成了?;氐轿锪鞴窘徊?。
cn007.Dispose();
cm007.Dispose();
command很高興,首戰告捷,以后的生意一定會很紅火呀。
【提?。ú樵儯┯涗洠蛏蠈又苯臃祷谼ataReader的情況】
第二天,那家書店又來找command,要從數據庫島提五本書過來。又來生意了,太好了,于是又派出了cm007和cn007。不過這次和昨天不太一樣,昨天是送貨到倉庫,今天是從倉庫提貨。這次還需要DataReader派裝卸工來配合。
輕車熟路,cn007開著車帶著大家來到了大橋,cn007申請了一座大橋的使用權,來到了數據庫島,cm007把指令交給了數據庫管理員開始提貨。不過這次卻遇到了一點小問題,運輸車的運載量的太小了,一次只能運一本書(一條記錄)??墒沁@次卻需要提五本書(五條記錄),沒辦法,只好多跑幾趟了。
帶上一本書(一條記錄),來到了書店,書店老板很高興,這么快就到了呀,趕快卸貨上架吧。咦等等,怎么只有一本書呀。Cm007只好解釋,我們的車運載量太小了,一次只能運一條記錄,不過速度還是很快的呀。
書店老板想了想,也湊合了,那你們趕快運下一條記錄吧。
如是這般,折騰了五趟,總算把貨物全都運完了。
“等等”,cn007說,“大橋的使用權還沒有交回去呢。”于是大家又來到了橋頭,把使用權交了回去。
最后回到物流公司交差。
【改進,向上層返回DataTable】
這回command可高興不起來了。大橋是按照占用時間來收費的,這么來回折騰,大橋的占用時間明顯變長了,這就增加了成本呀。另外現在汽油這么貴,來回折騰燒的可都是錢呀,就不能跑一趟多運點嗎?
于是command把大家召集過來一起商量這個事情。cn007說,大橋這一段沒有什么辦法可想了,一次只能運出來一條記錄,這個也不知道是誰規定的,我們也改不了。不過從橋頭到客戶那里我們倒是可以想想辦法,我有一個朋友,DataAdapter,他們也許會有辦法。Command聽了也沒有什么其他的方法,那就把DataAdapter請過來,一起商量一下吧。
第二天,DataAdapter過來了,也帶來了他的解決方案。其實也很簡單,他們公司可以提供集裝箱(就是DataTable),在橋頭等待,貨物運到的時候由DataReader裝到集裝箱里,然后立刻返回運第二批貨物。等需要的貨物全都裝完了之后,在開著集裝箱運到客戶那里。
SqlDataAdapter da007 = new SqlDataAdapter();
DataTable dt007 = new DataTable();
da007.Fill(dt007);
這樣就節省了大橋的占用時間,節省了成本。到客戶的這段路程,集裝箱跑一趟就可以了,省油。
這個方案不錯,command欣然接受。
過了幾天,書店又要提一批圖書,這次采用了集裝箱的方案,果然大大節省了成本,客戶也很滿意,雖然一開始要等待比較長的時間,但是好在一次性就可以得到全部的貨物。
【多種返回類型:DataRow、object[]、object】
有一天又發現了一個新問題,書店只要一本書。就一本書,也弄一個集裝箱?太浪費了吧。怎么辦?干脆直接用DataRow吧。實在不行用object[]。對于一條記錄也足夠用了。
【實體類開始登場】
于是物流公司的生意是越來越紅火了。有一家大型超市也找到了command,希望能夠為超市運輸貨物。這可是一比大買賣呀,command當然是很高興。大家一拍即合。
一開始合作的也很愉快,但是過了幾天出現了一點小問題。
【DataTable的缺點】
超市的老板找到了command,“你們的集裝箱確實挺好,但是有一個小問題呀。他們的樣子都是一模一樣的,只能通過外面的標簽來區分里面的貨物,這個太不方便了,而且還容易出錯,昨天本來想運一批‘微波爐’,結果標簽寫錯了,寫成了‘光波爐’。幸好發現的及時,否則就賠大發了。你們能不能想個好點的辦法呢?”。
command心想:“你們把標簽寫錯了,和我有什么關系呢?”不過客戶就是上帝呀,得罪不起,還得想個辦法解決一下。
于是又把大家都召集過來一起商議。只是這次并沒有上次那么順利,想了不少辦法,但是都不理想。正在一籌莫展的時候,面向對象公司的推銷員來了。
【實體類來了】
面向對象的推銷員知道了這個問題后笑了(來生意了呀,哈)。“這個正是我們的優勢呀,相對于集裝箱(DataTable)的容易出錯這個缺點,我們推出來‘實體類’,這種新型的集裝箱,是根據不同的貨物量身定做的,微波爐的實體類只能裝微波爐,光波爐的實體類只能裝光波爐,冰箱的實體類只能裝冰箱……而且他們的外形也和獨特,一眼就能看出來,很好區分。”
Command一聽,這個好哇,正愁這件事情呢,太好了。“我們正在和一家大型超市合作,他們的貨物有很多的種類,每一類都定制一個實體類,這樣不就不會出錯了嗎?哈哈??彀殉欣习逭襾硪黄鹕套h一下。”
【不僅實體類來了,還帶來了一批專門的裝卸工人】
但是事實和理想總是有那么一點差距。以前用集裝箱(DataTable)的時候,結構是一樣的,DataAdapter只需要一種工人就可以完成裝卸的工作,但是采用實體類之后,就必須按照實體類的各自的特點來找人。
能夠給冰箱實體類裝貨物的工人,不能給電視實體類裝貨物,因為兩種實體類的結構是不一樣的。同理也不能給其他實體類裝卸貨物。這樣就需要很多工人,一批工人專門裝卸冰箱實體類,另一批工人專門裝卸電視實體類……。
問題還不只這些,一開始超市大量提取CRT顯示器,但是過了一段時間基本不提取CRT顯示器的,因為被液晶顯示器代替了。Command本來想去掉CRT的實體類和其裝運工人,但是超市說了,雖然現在不怎么賣CRT了,但是還是有需求的呀。你裁掉了,下個月想運CRT顯示器怎么辦呀?
這樣成本就又上來了。而且很可能養著一批工人,但是他們又沒什么事情可干。
Command愁壞了,想要改回集裝箱,但是客戶又不同意,實體類很好用呀,你怎么可以改回不好用的集裝箱呢?
這可怎么辦?成本居高不下,快賠死了。
【“反射”登場了】
這時候又來了一個推銷員。(怎么推銷員這么多呢?)
這次是反射公司的推銷員,他帶來了一個叫做“反射”的東東,用了這個就不怕不同類型的實體類了,因為用了反射,同一批工人就可以給不同類型的實體類賦值了,不在需要向以前那樣,不同的實體類需要不同的工人了。
太好了,這樣就不需要那么多不同類型的工人了,成本又可以降低下來了。
故事就先到這里吧,再往下就應該說一說反射的效率問題了,但是這方面我還沒有做過測試,理論上更是不清楚。所以就先不說了。
這個只能算是故事梗概吧,讀起來很是干干巴巴的,沒什么味道。俺語文沒學好,文筆很差。這里表達的重點有兩個。
一個是Connection和連接池的關系,Connection、Command、DataReader、DataAdapter他們的關系。我把Command看成了一個大的容器,在故事里是一個物流公司,其他的是下屬部門或者是合作伙伴。
另一個是DataTable和實體類。只是這一點說得并不是很詳細,他們的優缺點說得也不多。
目前就只想到了這些。后一篇就是代碼篇了。
NET技術:重溫數據庫訪問——故事篇,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。