iT邦幫忙

DAY 16
5

OpenAccess ORM for Oracle 實戰演練系列 第 12

OpenAccess ORM for Oracle 實戰演練 Day 16

OpenAccess快速入門12
OpenAccess 快速入門將協助我們熟悉 OpenAccess,第十二篇說明如何透過 OpenAccess 刪除資料庫中的既有資料。
透過 OpenAccess ORM 查詢、新增、更新資料,我們都已在前面幾篇文章說明過了,現在就剩最後一個基本操作還沒講,就是刪除資料。

刪除資料的方式和更新資料相同,都必須先找出要刪除的資料,然後不一樣的地方就是,更新資料直接調用 SaveChanges() 函式,但刪除資料,必須先調用物件容器的 Delete() 函式,再調用 SaveChanges() 函式,即可將資料從底層資料庫中移除。

我們在 Model 專案中,找出先前已經建立的 ProductsMgmt 類別,在裡面增加一個 DeleteProduct() 函式:

Public Function DeleteProduct(Id As Long) As Boolean
    Dim product = (From x In cxt.Products
                  Where x.PRODUCTID = Id
                  Select x).FirstOrDefault()
    If product Is Nothing Then
        Throw New System.NullReferenceException(String.Format("查無產品編號:{0} 的資料。", Id))
    End If
    cxt.Delete(product)
    cxt.SaveChanges()
    Return True
End Function

上述 DeleteProduct() 接受一個 Id 的參數,然後會去查出此筆 Id 的產品資料,若查無資料當然要擲出例外,若有資料,就調用物件容器的 Delete() 和 SaveChanges() 函式,執行刪除作業。

為了方便測試,所以我在也在 CreateEntities 類別中,加入一個建立產品的新函式(CreateProduct())

Public Function CreateProduct() As Products
    Dim category = cxt.Categories.First()
    Dim product As New Products()
    With product
        .Categories = category
        .PRODUCTNAME = "奇行種巨人"
        .UNITPRICE = 500D
        .DISCONTINUED = 0
        .VOA_CLASS = "123456789"
    End With
    cxt.Add(product)
    cxt.SaveChanges()
    Return product
End Function

接著撰寫測試程式:

<TestMethod()> _
<ExpectedException(GetType(System.NullReferenceException))> _
Public Sub DeleteProduct_RaiseException()
    Dim target As ProductsMgmt = New ProductsMgmt()
    Dim Id As Long = 99999999
    target.DeleteProduct(Id)
End Sub

<TestMethod()> _
Public Sub DeleteProductTest()
    Dim target As ProductsMgmt = New ProductsMgmt()
    Dim createBo = New CreateEntities()
    Dim product = createBo.CreateProduct()
    Dim expected As Boolean = True
    Dim actual = target.DeleteProduct(product.PRODUCTID)
    Assert.AreEqual(expected, actual)
End Sub

第一個測試是模擬產品不存在要擲回 NullReferenceException 的情況,第二個測試則是先調用 CrenteEntities.CreateProduct() 函式,建立一筆測試用的產品資料後,再調用 ProductsMgmt.DeleteProduct() 將剛剛新增的產品資料之編號當參數傳入函式。

確定測試程式都通過後,我們就在 Web 專案中,建立一個 DeleteProduct.aspx 頁面,以 GridView 呈現產品資料,並建立一個【刪除資料】的連結,會調用 DeleteProduct() 函式:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="DeleteProduct.aspx.vb" Inherits="OpenAccessWebApp01.DeleteProduct" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>


    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="gvProduct" runat="server">
                <Columns>
                    <asp:CommandField ShowDeleteButton="True" DeleteText="刪除資料" HeaderText="動作" ShowCancelButton="False"></asp:CommandField>
                </Columns>
            </asp:GridView>
        </div>
    </form>

DeleteProduct.aspx.vb

Imports OpenAccessWebApp01Model

Public Class DeleteProduct
    Inherits System.Web.UI.Page

    Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        BindData()
    End Sub

    Private Sub BindData()
        Dim bo = New ProductsMgmt()
        gvProduct.DataSource = bo.GetGiantProducts()
        gvProduct.DataKeyNames = New String() {"PRODUCTID"}
        gvProduct.DataBind()
    End Sub

    Private Sub gvProduct_RowDeleting(sender As Object, e As GridViewDeleteEventArgs) Handles gvProduct.RowDeleting
        Dim bo = New ProductsMgmt()
        Dim result = bo.DeleteProduct(e.Keys("PRODUCTID"))
        BindData()
    End Sub
End Class

執行結果:

PS. 上面這張圖是 gif 動畫,但是在 Chrome 好像不會重覆播放,所以再留個連結,才不用重整畫面:http://i.minus.com/iSIUErui5nYEq.Gif


上一篇
OpenAccess ORM for Oracle 實戰演練 Day 15
下一篇
OpenAccess ORM for Oracle 實戰演練 Day 17
系列文
OpenAccess ORM for Oracle 實戰演練26

1 則留言

我要留言

立即登入留言