iT邦幫忙

DAY 22
3

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

OpenAccess ORM for Oracle 實戰演練 Day 22

  • 分享至 

  • xImage
  •  

透過OpenAccessLinqDataSource執行新增作業
前一篇簡單透過 OpenAccessLinqDataSource 執行簡易查詢,並且做了免寫程式直接刪除資料的範例,本篇文章要說明如何透過 OpenAccessLinqDataSource 執行新增,而且在對應的事件做一些處理。
前一篇簡單透過 OpenAccessLinqDataSource 執行簡易查詢,並且做了免寫程式直接刪除資料的範例,現在我們來試試透過 OpenAccessLinqDataSource 新增一筆類別資料,而且做點小變化。

請在 Web 專案中,新增一個 InsertOperation.aspx 頁面,放一個類別名稱的輸入欄位、新增按鈕和顯示結果用的 Label,當然還要放一個 OpenAccessLinqDataSource 控制項:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="InsertOperation.aspx.vb" Inherits="OALinqDataSourceWeb01.InsertOperation" %>
<%@ Register Assembly="Telerik.OpenAccess.Web.40" Namespace="Telerik.OpenAccess.Web" TagPrefix="telerik" %>

<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:TextBox ID="txtCategoryName" runat="server"></asp:TextBox>
            <asp:Button ID="btnCreate" runat="server" Text="新增類別" />
            <br />
            <asp:Label ID="lblResult" runat="server" ForeColor="Red"></asp:Label>
        </div>
        <telerik:OpenAccessLinqDataSource ID="OpenAccessLinqDataSource1" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EnableInsert="True" EntityTypeName="" ResourceSetName="Categories">
            <InsertParameters>
                <asp:Parameter Name="DESCRIPTION" DefaultValue="這是類別描述預設值" />
            </InsertParameters>
        </telerik:OpenAccessLinqDataSource>
    </form>

上面有個地方我們會覺得疑惑,就是 InsertParameters 區段。這個區段是讓我們設定某些實體屬性預設值的方式,例如類別有類別描述,因為我們只有在頁面上放類別名稱,所以就在這裡放了類別描述屬性的預設值。

接著要設定 OpenAccessLinqDataSource 的資料來源,和前一篇一樣,我們選擇 NWModel,並指定使用 Categories 實體集,然後在按【Next】,這裡我們切換到【Advance】頁籤,勾選「Enable Automatic Inserts」,或者也可以直接按【Finish】鈕,然後再透過 OpenAccessLinqDataSource 智慧標籤勾選「Enable Insert」即可:

接著我們撰寫新增按鈕的事件處理程式:

Protected Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click
	Dim listDictionary As New ListDictionary()
	listDictionary.Add("CATEGORYNAME", txtCategoryName.Text.Trim())
	lblResult.Text = ""
	Try
		OpenAccessLinqDataSource1.Insert(listDictionary)
		lblResult.Text &= "新增成功。"
	Catch ex As Exception
		lblResult.Text &= ex.Message
	End Try
End Sub

請注意,上面程式刻意不去處理類別名稱未填寫或長度超過限制的問題,因為稍後程式碼會去處理。現在我們執行看看結果:

Gif: http://i.minus.com/iUI7WQOEAuqrz.Gif

輕鬆的就完成新增資料的動作囉。接著我們要再做點進階的事,在 OpenAccessLinqDataSource 新增時,有兩個事件叫 Inserting 和 Inserted,分別是在 OpenAccessLinqDataSource 執行新增動作前,和執行新增動作完成時,我們可以用程式介入的時間點。上述 Gif 畫面中,我們看到新增成功時,會顯示類別編號,這個在 btnCreate_Click 並沒有做,是在 Inserted 時加入的,另外,我們在 Inserting 時,可以調整要寫入的資料屬性,例如類別有描述,先前我們在 Html 中做了預設值,但是在 Inserting 事件事,我們可以再度調整它。

除此之外,當 OpenAccess ORM 存取底層資料庫發生錯誤時,我們也可以在 Inserted 事件中,透過 e.Exception 屬性取出錯誤訊息,若不打算把此 Exception 擲出,我們還可以設定 e.ExceptionHandled = True,表示錯誤已處理完成,不用往上層丟,請見下述範例程式碼:

Private Sub OpenAccessLinqDataSource1_Inserted(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceStatusEventArgs) Handles OpenAccessLinqDataSource1.Inserted
	If e.Exception IsNot Nothing Then
		lblResult.Text = e.Exception.Message
		e.ExceptionHandled = True
	End If
	Dim category As Categories = TryCast(e.Result, Categories)
	VerifyCategoryInstance(category)
	lblResult.Text = "類別編號:" + category.CATEGORYID.ToString()
End Sub

Private Sub OpenAccessLinqDataSource1_Inserting(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceInsertEventArgs) Handles OpenAccessLinqDataSource1.Inserting
	Dim category As Categories = TryCast(e.NewObject, Categories)
	VerifyCategoryInstance(category)
	If String.IsNullOrWhiteSpace(category.DESCRIPTION) Then
		category.DESCRIPTION = "在 Insedrting 事件時修改了 Description"
	End If
End Sub

Private Shared Sub VerifyCategoryInstance(ByVal category As Categories)
	If category Is Nothing Then
		Throw New System.NullReferenceException("無法取得類別資料。")
	End If
End Sub

上一篇
OpenAccess ORM for Oracle 實戰演練 Day 21
下一篇
OpenAccess ORM for Oracle 實戰演練 Day 23
系列文
OpenAccess ORM for Oracle 實戰演練26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言