透過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