iT邦幫忙

DAY 28
4

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

OpenAccess ORM for Oracle 實戰演練 Day 28

透過OpenAccessLinqDataSource的Expression Editor建立物件屬性預設值
運算式編輯器是一個挺好玩的工具,這篇我們來看一下新增和修改時,透過它建立屬性預設值的方式和一點小技巧。
經過前兩篇的洗禮,應該對運算式編輯器很熟悉了,所以話不多話,直接看一下 Insert、Update 的運算式編輯器畫面:

PS. 因為 Insert、Update、Delete 的運算式編輯器畫面長的都一樣,所以只抓 Update 的畫面做代表。

和前兩篇 Where、OrderBy 的畫面長的不一樣囉,少了輸入運算式的地方,只能直接繫結資料來源。那這裡的繫結資料來源,會發生什麼樣的作用呢?以下圖為例:

參數名稱必須是實體物件的屬性,這樣在新增、修改資料時,就會用我們所設定的值當做該屬性預設值,回寫底層資料庫。但這裡有兩個地方要特別留心,因為常常因此造成非預期結果,也就是屬性回寫資料庫後,不是我們所設定的值:

  1. 參數名稱必須是實體物件的屬性名稱。請注意,若不小心打錯字,參數名稱對應不上屬性名稱,編譯不會有錯誤,執行時期也不會發生例外,唯一發生的狀況就是回寫資料庫的欄位沒有預設值,很容易就被我們忽略掉,直到客戶回報時才發現,這就囧了。

  2. 該屬性必須在資料來源中已定義,但未在資料控制項中繫結。例如我們查詢出 CategoryId、CategoryName、Description,但是在資料繫結時,只繫結了 CategoryId 和 CategoryName,這樣 Description 的預設值才會生效。

現在我們在 Web 專案中加入一個新的 WebForm 名為 InsertUpdateByExpressionEditor.aspx,加入以下控制項,目的就是為了展示 Description 屬性預設值,什麼情況會生效和失效:

● 一個 TextBox,名為 txtCategoryName,用來輸入要新增的類別名稱。
● 一個 Button,名為 btnCreate,Click 時會抓 txtCategoryName 的值,然後調用 oasrcInsertCategories 控制項的 Insert 函式。
● 一個 Label,名為 lblLog,用來顯示執行結果和執行的 Sql Script。
● 一個 OpenAccessLinqDataSource,名為 oasrcInsertCategories,負責執行 Insert Categories 作業,透過運算式編輯器撰寫 Insert 時,Description 屬性的預設值。
● 一個 OpenAccessLinqDataSource,名為 oasrcCategories,負責查詢 Categories 資料,並執行 Update 作業,我們會透過運算式編輯器撰寫 Update 時,Description 屬性的預設值。
● 一個 GridView,名為 gvList,以 oasrcCategories 為資料來源,顯示查詢結果,並啟用編輯功能。

InsertUpdateByExpressionEditor.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="InsertUpdateByExpressionEditor.aspx.vb" Inherits="OALinqDataSourceWeb01.InsertUpdateByExpressionEditor" %>

<%@ 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>
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" />


    <form id="form1" runat="server">
        <div>
            類別名稱:<asp:TextBox ID="txtCategoryName" runat="server"></asp:TextBox>
            <asp:Button ID="btnCreate" runat="server" Text="新增類別" CssClass="btn-mini btn-primary" />
            <br />
            <asp:Label ID="lblLog" runat="server" ForeColor="Red"></asp:Label>
            <telerik:OpenAccessLinqDataSource ID="oasrcInsertCategories" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EnableInsert="True" EntityTypeName="" ResourceSetName="Categories">
                <InsertParameters>
                    <asp:Parameter Name="DESCRIPTION" DefaultValue="這是類別描述預設值" />
                </InsertParameters>
            </telerik:OpenAccessLinqDataSource>
            <asp:GridView ID="gvList" runat="server" AutoGenerateColumns="False" DataKeyNames="CATEGORYID" DataSourceID="oasrcCategories">
                <Columns>
                    <asp:BoundField DataField="CATEGORYID" HeaderText="CATEGORYID" ReadOnly="True" InsertVisible="False" SortExpression="CATEGORYID"></asp:BoundField>
                    <asp:BoundField DataField="CATEGORYNAME" HeaderText="CATEGORYNAME" SortExpression="CATEGORYNAME"></asp:BoundField>
                    <asp:BoundField DataField="DESCRIPTION" HeaderText="DESCRIPTION" SortExpression="DESCRIPTION"></asp:BoundField>
                    <asp:CommandField ShowEditButton="True"></asp:CommandField>
                </Columns>
            </asp:GridView>
            <telerik:OpenAccessLinqDataSource ID="oasrcCategories" runat="server" ContextTypeName="OALinqDataSourceWeb01.NWModel" EntityTypeName="" ResourceSetName="Categories" EnableUpdate="true">
                <UpdateParameters>
                    <asp:Parameter Name="DESCRIPTION" DefaultValue="這是類別描述預設值" />
                </UpdateParameters>
            </telerik:OpenAccessLinqDataSource>
        </div>
    </form>

InsertUpdateByExpressionEditor.aspx.vb

Public Class InsertUpdateByExpressionEditor
    Inherits System.Web.UI.Page
    Private tracer As MyNorthwindTraceListener

    Private Sub InsertByExpressionEditor_Init(sender As Object, e As EventArgs) Handles Me.Init
        If tracer Is Nothing Then
            tracer = New MyNorthwindTraceListener(New StringBuilder())
        End If
    End Sub

    Private Sub btnCreate_Click(sender As Object, e As EventArgs) Handles btnCreate.Click
        Dim listDictionary As New ListDictionary()
        listDictionary.Add("CATEGORYNAME", txtCategoryName.Text.Trim())
        lblLog.Text = ""
        Try
            Dim tracer = New MyNorthwindTraceListener(New StringBuilder())
            oasrcInsertCategories.Insert(listDictionary)
            lblLog.Text &= "<br />新增成功。<br />" & tracer.GetLogString()
            gvList.DataBind()
        Catch ex As Exception
            lblLog.Text &= ex.Message
        End Try
    End Sub

    Private Sub oasrcCategories_Updated(sender As Object, e As Telerik.OpenAccess.Web.OpenAccessLinqDataSourceStatusEventArgs) Handles oasrcCategories.Updated
        lblLog.Text = tracer.GetLogString()
    End Sub
End Class

我們先執行新增作業,看 Description 是否以預設值呈現,接著我們在 GridView 中,編輯剛剛那筆資料,把 Description 的值換掉,並按【更新】連結,看 Description 的結果為何:

第一個示範,我們只填寫了類別名稱,但是新增時,我們會發現類別描述套用在運算式編輯器所建立的 Description 預設值。這裡大家可以試著把參數名稱打錯,就會發現新增完,Description 沒有預設值囉,這個簡單的練習就不示範了。

第二個示範,我們在 GridView 中有建立一個 BoundField 繫結 Description 屬性,所以更新資料後,會發現實際回寫 Description 的值,是在 GridView 中所輸入的內容,而非參數預設值。


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

尚未有邦友留言

立即登入留言