日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET2.0数据操作之创建数据访问层(3)

發(fā)布時(shí)間:2024/8/5 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET2.0数据操作之创建数据访问层(3) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第四步:插入,更新和刪除數(shù)據(jù)

  常用的插入,更新和刪除數(shù)據(jù)的模式有兩種。第一種模式,我稱之為DB直接模式,涉及的方法被調(diào)用時(shí),會向數(shù)據(jù)庫里發(fā)出一個(gè)INSERT, 或UPDATE,或DELETE命令,這個(gè)命令只對單個(gè)數(shù)據(jù)庫記錄做操作。象這樣的方法一般接受一系列對應(yīng)于插入,更新或刪除的值的標(biāo)量參數(shù)(譬如整數(shù),字符串,布爾值,日期時(shí)間等)。譬如,用這個(gè)模式來操作Products表的話,刪除方法會接受一個(gè)整數(shù)參數(shù),代表所需要?jiǎng)h除的記錄的ProductID,而插入方法則會接受一個(gè)對應(yīng)于ProductName的字符串,對應(yīng) 于UnitPrice的decimal值,對應(yīng)于UnitsOnStock的整數(shù)等等。


圖 21: 每個(gè)插入,更新,和刪除請求都被立刻發(fā)送到數(shù)據(jù)庫

  另外一個(gè)模式,我稱之為批更新模式,可以在一個(gè)方法調(diào)用里更新整個(gè)DataSet,或者整個(gè)DataTable,或 者一個(gè)DataRow集合。在這個(gè)模式里,開發(fā)人員在一個(gè)DataTable中刪除,插入,修改DataRow,然后把這 些DataRow或整個(gè)DataTable傳給一個(gè)更新方法。然后這個(gè)方法會輪循傳入的DataRow們,通過DataRow的RowState屬 性屬性來決定這些DataRow是否被改動(dòng)過,或是新記錄,或是被刪除的記錄,然后為每個(gè)記錄發(fā)出合適的 數(shù)據(jù)庫命令。


圖 22: 在Update 方法調(diào)用之后,所有的變動(dòng)都與數(shù)據(jù)庫同步了

  在默認(rèn)情形下,TableAdapter采用批更新模式,但也支持DB直接模式。因?yàn)槲覀冊趧?chuàng)建我們的TableAdapter時(shí)的高級選項(xiàng)中選擇了“生成插入,更新,和刪除語句” 這個(gè)選項(xiàng),ProductsTableAdapter 包含了一個(gè) Update()方法,該方法實(shí)現(xiàn)了批 更新模式。具體地說,TableAdapter包含了一個(gè)Update()<昀敳獴搨 ???oЁCODE> 方法,可以傳入一個(gè)強(qiáng)類型 的DataSet,或者一個(gè)強(qiáng)類型的DataTable,或者一個(gè)和多個(gè)DataRow。假如你在一開始創(chuàng)建TableAdapter時(shí)的選項(xiàng)中沒有清除“生成DB直接方法(GenerateDBDirectMethods)”復(fù)選框的話,DB直接模 式也會通過Insert(),Update()和Delete()方法來實(shí)現(xiàn)。

  這兩種數(shù)據(jù)修改模式都使用 了TableAdapter的InsertCommand,UpdateCommand, 和DeleteCommand屬性來向數(shù)據(jù)庫發(fā)出對應(yīng) 的INSERT,UPDATE和DELETE命令。你可以在DataSet設(shè)計(jì)器里點(diǎn)擊TableAdapter,然后在屬性窗口查看和改 動(dòng)InsertCommand,UpdateCommand, 和DeleteCommand屬性。(確 認(rèn)你選擇了TableAdapter,并且ProductsTableAdapter對象是屬性窗口中下拉框里被選中的項(xiàng))


圖23: TableAdapter包含InsertCommand,UpdateCommand, 和DeleteCommand等屬性

  想查看或改動(dòng)這些數(shù)據(jù)庫命令的屬性的話,點(diǎn)擊CommandText子屬性,這會啟動(dòng)對應(yīng)的查詢 生成器。


圖 24: 在查詢生成器里配置插入,更新,刪除語句

  下面的編碼例子示范了如何使用批更新模式來把沒被終止的,且?guī)齑娴扔诨蛏儆?5個(gè)單元的產(chǎn)品的價(jià)格加 倍:

C#
123456789101112 NorthwindTableAdapters.ProductsTableAdapterproductsAdapter =new NorthwindTableAdapters.ProductsTableAdapter();// For each product, double its price if it is not discontinuedand// there are 25 items in stock or lessNorthwind.ProductsDataTable products = productsAdapter.GetProducts();foreach (Northwind.ProductsRow product in products)if (!product.Discontinued && product.UnitsInStock<= 25)product.UnitPrice *= 2;// Update the productsproductsAdapter.Update(products);


  下面的編碼示范如何使用DB直接模式刪除一個(gè)產(chǎn)品,更新一個(gè)產(chǎn)品,然后添加一個(gè)新的產(chǎn)品:

C#
123456789101112 NorthwindTableAdapters.ProductsTableAdapterproductsAdapter = newNorthwindTableAdapters.ProductsTableAdapter();// Delete the product with ProductID 3productsAdapter.Delete(3);// Update Chai (ProductID of 1), setting the UnitsOnOrder to15productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",18.0m, 39, 15, 10, false, 1);// Add a new productproductsAdapter.Insert("New Product", 1, 1,"12 tins per carton", 14.95m, 15, 0, 10, false);

  創(chuàng)建自定義的插入,更新,刪除方法

  用DB直接法生成的Insert(), Update(),和Delete()方法有時(shí) 候會感覺有點(diǎn)不方便,特別是當(dāng)數(shù)據(jù)表有許多字段的時(shí)候。看一下前面這個(gè)編碼例子,沒有IntelliSense的幫 助的話,不是很清楚Products表的哪個(gè)字段對 應(yīng)Update()和Insert()方法中的哪個(gè)輸入?yún)?shù)。有時(shí)候我們只要更新一到二個(gè)字 段或者需要一個(gè)自定義的Insert()方法,這個(gè)方法需要返回剛插入的記錄 的IDENTITY(自增)的字段值。

  要?jiǎng)?chuàng)建這樣的自定義方法,回到DataSet設(shè)計(jì)器。在TableAdapter上按右鼠標(biāo),選擇“添加查詢”,然后回 到TableAdapter配置向?qū)АT诘诙辽?#xff0c;我們可以指明要生成的查詢的類型。讓我們生成一個(gè)添加新 的product(產(chǎn)品)記錄,然后返回新添加記錄的ProductID值的方法。因此,選擇生成一個(gè)插 入(INSERT)型查詢。


圖25: 創(chuàng)建一個(gè)給Products表添加新記錄的方法

  下一個(gè)屏顯示InsertCommand的CommandText屬性。在查詢語句后面,增添一 個(gè)SELECT SCOPE_IDENTITY()的查詢,這查詢將返回當(dāng)前同一個(gè)操作范圍內(nèi)插 入IDENTITY字段的最后那個(gè)identity 值。(詳見技術(shù)文檔中關(guān) 于SCOPE_IDENTITY()的內(nèi)容以及為什么你應(yīng)該使用SCOPE_IDENTITY()而不是 @@IDENTITY)。確認(rèn)在添加SELECT語句前,你在INSERT語句后面添一個(gè)分號 。


圖26: 增添查詢返回SCOPE_IDENTITY()值

  最后,把這個(gè)新方法命名為InsertProduct。


圖 27:放方法名字設(shè)成InsertProduct

  當(dāng)你返回DataSet設(shè)計(jì)器時(shí),你將看到ProductsTableAdapter多了一個(gè)新的方 法,InsertProduct。如果對應(yīng)Products表的每個(gè)字段,這個(gè)新的方法沒有對應(yīng)的參數(shù)的話,非常可能的原因是,你忘了給INSERT語句的結(jié)尾添加一個(gè)分號(semi-colon)。重新配 置InsertProduct方法,確認(rèn)在INSERT和SELECT語句間有個(gè)分號。

  在默認(rèn)情形下,插入方法調(diào)用的是非查詢(non-query)方法,意即,他們只返回受影響的記錄數(shù)。但是,我們想要讓InsertProduct方法返回一個(gè)查詢返回的值,而不是受影響的記錄數(shù)。這可以把InsertProduct方法的ExecuteMode屬性改 成Scalar(標(biāo)量)來實(shí)現(xiàn)。


圖 28:把ExecuteMode屬性改成Scalar

  下面的編碼示范如何使用這個(gè)新的InsertProduct方法:

C#
1234567 NorthwindTableAdapters.ProductsTableAdapterproductsAdapter = newNorthwindTableAdapters.ProductsTableAdapter();// Add a new productint new_productID =Convert.ToInt32(productsAdapter.InsertProduct("NewProduct", 1, 1, "12 tins per carton",14.95m, 10, 0, 10, false));// On second thought, delete the productproductsAdapter.Delete(new_productID);

轉(zhuǎn)載于:https://www.cnblogs.com/greateast/archive/2007/01/24/629177.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET2.0数据操作之创建数据访问层(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。