国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在Visual Studio 2005和ASP.NET 2.0中使用強(qiáng)類型數(shù)據(jù)存取

2024-07-10 13:09:45
字體:
供稿:網(wǎng)友
  • 本文來源于網(wǎng)頁設(shè)計(jì)愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • "never put off until run time what can be done at compile time."
    david gries, compiler construction for digital computers

    introduction

      作為程序員,我們?cè)趯W(xué)習(xí)一些新技術(shù)的時(shí)候,范例有時(shí)候會(huì)是我們最大的敵人。指南通常被設(shè)計(jì)成簡(jiǎn)單易懂,但同時(shí)里面的懶惰、無效率的甚至是危險(xiǎn)的代碼編寫會(huì)增多。像這種情況最普遍存在的就是在ado.net的范例中了。在這篇文章中,我們將看一下數(shù)據(jù)庫中的強(qiáng)類型對(duì)象有什么意義,會(huì)讓你在你的程序中這樣做,盡管缺乏范例。
      有點(diǎn)特別的是,我們將看到在visual studio 2005中是如何創(chuàng)建和使用強(qiáng)類型數(shù)據(jù)集的。正如這篇文章所探究的,與另外一種弱類型數(shù)據(jù)存取技術(shù)相比,強(qiáng)類型數(shù)據(jù)集提供了許多有利之處。我們也會(huì)在這里看到,用visual studio 2005創(chuàng)建和使用強(qiáng)類型數(shù)據(jù)集并沒有變得更簡(jiǎn)單。想學(xué)更多就繼續(xù)看下去吧。

    the basics and benefits of strongly-typed objects

      要想明白強(qiáng)類型是什么意思,你可以先想想約會(huì)。如果你是單身,你會(huì)考慮跟哪種類型的人約會(huì)呢?你可能有一些特定的標(biāo)準(zhǔn)(比如健康和有魅力),又或者標(biāo)準(zhǔn)很簡(jiǎn)單或并不是很明確。無論你的條件是什么,當(dāng)你決定更多地與誰一起的時(shí)候,你總會(huì)用自己對(duì)這一些類型的一定的標(biāo)準(zhǔn)去衡量考慮。如果你很聰明,你會(huì)想一大堆來保護(hù)自己不受感情創(chuàng)傷。你可能會(huì)發(fā)現(xiàn),比如說,與一個(gè)酒鬼相處是很不穩(wěn)定,除非兩人之間有一個(gè)認(rèn)真的關(guān)系。但是,讓一個(gè)人改變是很痛苦并且非常困難的。因此,你的智慧會(huì)指示你讓你在這段關(guān)系開始前就叫停。給你的約會(huì)標(biāo)準(zhǔn)里加一個(gè)不喝酒的條款會(huì)保護(hù)你不會(huì)在未來心痛,并且讓你可以更專心的把你的時(shí)間和精力放在更好的候選人身上。
      你可能在驚訝這個(gè)推理與編程有什么關(guān)系。沒關(guān)系,跟我來吧,可愛的讀者!ado.net數(shù)據(jù)存取對(duì)象是被設(shè)計(jì)成極富彈性的。當(dāng)你從數(shù)據(jù)庫中讀取數(shù)據(jù)時(shí),你可能是用許多平常.net framework允許的的通用類型的對(duì)象在工作,除非遇到特殊的問題。應(yīng)用我們的約會(huì)理論,基本上可以把你的相關(guān)數(shù)據(jù)看作是通用對(duì)象?!拔壹s會(huì)的只要不是太麻煩的就好了。”難道你就不能再明確一點(diǎn)嗎?甚至連是人還是其它生物都沒有限制!作為你的朋友,我懇求你,“多點(diǎn)標(biāo)準(zhǔn)吧!讓你的清單縮小一點(diǎn)!”
      正如你如果忽視約會(huì)的對(duì)象是誰會(huì)導(dǎo)致將來的關(guān)系問題一樣,在你的代碼中放任你的objects也會(huì)造成一些錯(cuò)誤。并且,如果你讓舊的object在你的子程序中漫舞,你可能直到程序運(yùn)行執(zhí)行時(shí)才會(huì)發(fā)現(xiàn)這是個(gè)問題。用我們的約會(huì)理論來看,在運(yùn)行時(shí)捕捉錯(cuò)誤就好像你的約會(huì)在一間新潮的意大利餐館中間發(fā)生痛苦和難堪的爭(zhēng)吵一樣。是的,你發(fā)現(xiàn)了,如果你在之前先有計(jì)劃,你就不會(huì)在一堆用餐者的注視中結(jié)束這個(gè)場(chǎng)面,也不會(huì)很難堪。只要在你的代碼里簡(jiǎn)單地應(yīng)用一些嚴(yán)格點(diǎn)的標(biāo)準(zhǔn),你就可以在程序開始編譯前捕捉到錯(cuò)誤。比如下面這句代碼例子:

    string firstname = myrow.("firstname").tostring();   
      這個(gè)例子中的datarow是無類型的,結(jié)果就是,你必須要用列的名字作字符串去得到你所需要的值(或者你可以選用這個(gè)列在記錄的列集合中的索引)。好在那一列確實(shí)存在。datarow的列的數(shù)據(jù)類型是object,我們假定這個(gè)firstname列下面的數(shù)據(jù)類型是string,而且我們?cè)谑褂弥氨仨氁阉@式轉(zhuǎn)換成string。如果這一列的名字發(fā)生變化(例如變成personfirstname),編譯器并沒有辦法通知你。郁悶吧?但你可以不這樣的。如果你的代碼像下面這樣,你的生活就會(huì)更簡(jiǎn)單,你的代碼就會(huì)更可靠。

    string firstname = personrow.firstname;

      在這第二個(gè)例子中,我們用一個(gè)強(qiáng)類型的行,并且我們知道firstname屬性是string類型的。沒有凌亂的列名,也沒有亂七八糟的類型轉(zhuǎn)換。編譯器已經(jīng)為我們做了類型檢查,我們可以放心的進(jìn)行其它工作,而絲毫不用擔(dān)心是否把列名敲對(duì)了。
      其它所有的東西都是一樣的,所以你肯定會(huì)毫不猶豫地使用這種方式,而不再使用通用類型的方式。但請(qǐng)等一下,強(qiáng)類型objects是從哪里來的?我也希望我可以告訴你這些objects是自動(dòng)創(chuàng)建的。但是,正如良好的關(guān)系需要時(shí)間和精力一樣,讓你的objects強(qiáng)類型也需要額外的努力。但花在這里的額外時(shí)間絕對(duì)是值得的,它也節(jié)省了在未來“捉臭蟲”時(shí)花費(fèi)的更多的指數(shù)級(jí)的時(shí)間。
      完成強(qiáng)類型有好幾種方法,我們將在這篇文章余下的部分介紹如何在visual studio 2005中創(chuàng)建強(qiáng)類型的數(shù)據(jù)集。我們也會(huì)把這種做法與其它做法的優(yōu)缺點(diǎn)作一個(gè)比較。

    creating strongly-typed datasets in visual studio 2005

      強(qiáng)類型數(shù)據(jù)集其實(shí)只是把普通數(shù)據(jù)集的列和表預(yù)先定義好,所以編譯器已經(jīng)知道它們包含什么。取代你好像帶著棒球手套弄的松散的包裝,強(qiáng)類型數(shù)據(jù)集正像一個(gè)非常合適的手套。而visual studio的每一次連續(xù)的版本都使得數(shù)據(jù)集強(qiáng)類型化的處理更加簡(jiǎn)單。在下面這個(gè)例子中,我們將使用sql server 2005的adventureworks數(shù)據(jù)庫。簡(jiǎn)單地執(zhí)行下面一些步驟:
    1. 打開visual studio,創(chuàng)建一個(gè)新的asp.net網(wǎng)站。
    2. 在solution explorer窗口,右鍵點(diǎn)擊新增一個(gè)項(xiàng),選擇dataset。給其命名為adventureworks.xsd(見截圖)。visual studio將推薦你把dataset文件放進(jìn)app_code文件來,你只要點(diǎn)同意就可以了。
    3. 打開adventureworks.xsd之后是設(shè)計(jì)模式,tableadapter配置向?qū)?huì)運(yùn)行。這時(shí)候,點(diǎn)取消,我們將從server explorer中把所要的表拖進(jìn)來。
    4. 在server explorer工具欄中瀏覽找到adventureworks數(shù)據(jù)庫。(如果你還沒有安裝adventureworks數(shù)據(jù)庫,你可以去微軟的下載頁面sql server 2005 samples and sample databases下載它和一些其它的sql server 2005示例)
    5. 把salesorderheader表和salesorderdetail表拖進(jìn)dataset的設(shè)計(jì)窗口。窗口應(yīng)該會(huì)像截圖中一樣。我們看到的是什么呢?每當(dāng)我們?cè)黾右粋€(gè)表,visual studio就會(huì)創(chuàng)建一個(gè)強(qiáng)類型datatable(名字和原來的表一樣)和一個(gè)tableadapter。這個(gè)datatable已經(jīng)為我們定義好每一列。tableadapter是我們用來填充表的,默認(rèn)有一個(gè)fill()方法從原表中得到每一行數(shù)據(jù)。

      照原來的樣子的話,這個(gè)強(qiáng)類型數(shù)據(jù)集將會(huì)返回這兩個(gè)表的所有記錄。但是adventureworks數(shù)據(jù)庫包含了許多訂單信息,因此為什么不創(chuàng)建一個(gè)更明確的查詢呢?我們可以給tableadapter對(duì)象增加方法來獲取一個(gè)特定的子記錄集。右鍵點(diǎn)擊salesorderheadertableadapter,然后選擇add|query。選擇“use sql statements”后點(diǎn)下一步,然后選擇“select which returns rows”再點(diǎn)下一步。最近,在窗口中輸入下面的查詢語句(或者可以使用query builder來完成這項(xiàng)工作):

    select
         salesorderid, revisionnumber, orderdate, duedate, shipdate,
         status, onlineorderflag, salesordernumber, purchaseordernumber,
         accountnumber, customerid, contactid, salespersonid, territoryid,
         billtoaddressid, shiptoaddressid, shipmethodid, creditcardid,
         creditcardapprovalcode, currencyrateid, subtotal, taxamt, freight,
         totaldue, comment, rowguid, modifieddate

    from sales.salesorderheader
    where (orderdate > @orderdate)
      這個(gè)sql查詢是一個(gè)簡(jiǎn)單的select查詢,用了一個(gè)@orderdate參數(shù)以篩選結(jié)果。這將使我們不用返回?cái)?shù)據(jù)庫中的所有記錄。保持“fill a datatable”和“return a datatable”復(fù)選框的選中,點(diǎn)完成。把這個(gè)select語句加完之后你的設(shè)計(jì)器現(xiàn)在應(yīng)該像截圖一樣,在salesorderheadertableadapter下面多了一個(gè)查詢。

      強(qiáng)類型數(shù)據(jù)集建立起來以后,我們就可以輕易地用幾行代碼在asp.net頁面中把數(shù)據(jù)顯示出來。在網(wǎng)站里新建一個(gè)asp.net頁面并轉(zhuǎn)到設(shè)計(jì)模式。拖一個(gè)gridview控件到上面,保留它的id為girdview1。然后到源代碼頁中,在文件的上方將adventureworkstableadapters命名空間引入(在c#里面語法是using adventureworkstableadapters;)。最后在page_load事件里增加下面的代碼:

    // create the salesorderheadertableadapter
    salesorderheadertableadapter salesadapter =
        new salesorderheadertableadapter();

    // get orders that took place after july 1st, 2004
    adventureworks.salesorderheaderdatatable orders =
        salesadapter.getdataby(new datetime(2004, 7, 1));

    // bind the order results to the gridview
    this.gridview1.datasource = orders;
    this.gridview1.databind();    

      代碼非常簡(jiǎn)單。我們創(chuàng)建一個(gè)salesorderheadertableadapter的實(shí)例以填充數(shù)據(jù)表。這里要注意的是,不同于普通的datatable,我們聲明了一個(gè)salesorderheaderdatatable類型的對(duì)象,我們調(diào)用getdateby()方法,傳遞一個(gè)datetime對(duì)象來填充數(shù)據(jù)。這里也要注意,獲取的命令也是強(qiáng)類型的,因此我們必須傳遞一個(gè)datetime對(duì)象,而不是一個(gè)普通的對(duì)象。下面的截圖即是上面代碼示例的結(jié)果。

      除了用代碼把結(jié)果集綁定到gridview外,你也可以用一個(gè)objectdatasource,把它的typename屬性設(shè)成adventureworkstableadapters.salesorderheadertableadapter,把它的selectmethod設(shè)置成getdata或者getdataby。
    除了連接數(shù)據(jù)庫不需要寫代碼之外,使用強(qiáng)類型數(shù)據(jù)集的另一大優(yōu)點(diǎn)是不存在編譯器無法檢查的潛伏在我們的代碼中的列名字符串。我們也不需要進(jìn)行任何類型轉(zhuǎn)換。如果數(shù)據(jù)庫架構(gòu)發(fā)生改變,只要更新adventureworks.xsd文件,我們就會(huì)發(fā)現(xiàn)所有相關(guān)的改變?cè)诰幾g時(shí)自動(dòng)完成了。

    other techniques for generating strongly-typed data-access applications

      除了使用強(qiáng)類型數(shù)據(jù)集之處,還有其它的方法可以在你的程序中實(shí)現(xiàn)強(qiáng)類型。你可以創(chuàng)建比datasets更輕量級(jí)并且更符合你數(shù)據(jù)庫的自定義類。也有一些第三方軟件開發(fā)者開發(fā)了自動(dòng)完成這一過程的工具。其中一個(gè)比較特別的也是我比較喜愛的是llblgen pro,我曾經(jīng)寫過關(guān)于它的一本書:rapid c# windows development: visual studio 2005, sql server 2005, and llblgen pro。(你可以在我的網(wǎng)站上免費(fèi)閱讀此書1/3的內(nèi)容。)另一個(gè)很歡迎的工具是codesmith。甚至微軟也在開發(fā)一個(gè)叫dlinq的小工具,但仍在測(cè)試之中,估計(jì)至少要等一下年才會(huì)推出。
      如果你使用visual studio的強(qiáng)數(shù)據(jù)集方法,不容置疑,其中一個(gè)優(yōu)點(diǎn)便是你不需要購買其它軟件。所有的這些解決方案都有不同的特點(diǎn)和好處,但最主要的好處是可靠,錯(cuò)誤少,花更少的時(shí)間調(diào)試。也更容易去檢查數(shù)據(jù)庫架構(gòu)改變所造成的影響并作維護(hù)。希望你已經(jīng)認(rèn)識(shí)到強(qiáng)類型的好處。祝開發(fā)好運(yùn)(約會(huì)也是)!

    by joseph chancellor

    attachments

    download the code examined in this article
    about the author
    joseph chancellor is a c# developer in southern california who has had his fair share of relational trauma. he appreciates all kinds of feedback and suggestions. visit his blog or read the first five chapters of his book on visual studio 2005, sql server 2005, and llblgen pro.

    發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 紫云| 永平县| 双牌县| 留坝县| 莎车县| 威宁| 抚顺县| 金阳县| 沽源县| 革吉县| 闽侯县| 连平县| 姚安县| 丹江口市| 武功县| 嘉鱼县| 邛崃市| 石首市| 定陶县| 永新县| 隆化县| 宜良县| 蓬安县| 根河市| 延庆县| 蒙自县| 淳安县| 桂阳县| 大余县| 嘉鱼县| 淳化县| 阿克| 辽阳市| 厦门市| 开鲁县| 花莲市| 墨竹工卡县| 色达县| 黔南| 道孚县| 毕节市|