共用方式為


ObjectDataSource.UpdateMethod 屬性

定義

取得或設定 ObjectDataSource 控制項叫用以更新資料之方法或函式的名稱。

public:
 property System::String ^ UpdateMethod { System::String ^ get(); void set(System::String ^ value); };
public string UpdateMethod { get; set; }
member this.UpdateMethod : string with get, set
Public Property UpdateMethod As String

屬性值

字串,表示 ObjectDataSource 用於更新資料之方法或函式的名稱。 預設為空字串。

範例

下列三個範例顯示網頁、程序代碼後置頁面類別,以及數據存取類別,讓用戶能夠擷取和更新 Northwind 資料庫中 Employees 數據表中的記錄。

第一個範例顯示包含兩ObjectDataSource個控件、一個控件和一個DropDownListDetailsView控件的網頁。 第一個 ObjectDataSource 控件和 DropDownList 控件是用來擷取和顯示資料庫中的員工名稱。 第二 ObjectDataSourceDetailsView 控件和控件是用來擷取、顯示和修改使用者所選取員工記錄中的數據。

<form id="Form1" method="post" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>
<form id="form1" runat="server">

    <asp:objectdatasource
      ID="ObjectDataSource1"
      runat="server"
      SelectMethod="GetFullNamesAndIDs"
      TypeName="Samples.AspNet.CS.EmployeeLogic" />

    <p>
    <asp:dropdownlist
      ID="DropDownList1"
      runat="server" 
      DataSourceID="ObjectDataSource1"
      DataTextField="FullName"
      DataValueField="EmployeeID" 
      AutoPostBack="True" 
      AppendDataBoundItems="true">
        <asp:ListItem Text="Select One" Value=""></asp:ListItem>
    </asp:dropdownlist>
    </p>

    <asp:objectdatasource
      ID="ObjectDataSource2"
      runat="server"
      SelectMethod="GetEmployee"
      UpdateMethod="UpdateEmployeeAddress"
      OnUpdating="EmployeeUpdating"
      OnSelected="EmployeeSelected"
      TypeName="Samples.AspNet.CS.EmployeeLogic" >
      <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" DefaultValue="-1" Name="empID" />
      </SelectParameters>
    </asp:objectdatasource>
    
    <asp:DetailsView
        ID="DetailsView1"
        runat="server"
        DataSourceID="ObjectDataSource2" 
        AutoGenerateRows="false"
        AutoGenerateEditButton="true">  
        <Fields>
            <asp:BoundField HeaderText="Address" DataField="Address" />
            <asp:BoundField HeaderText="City" DataField="City" />
            <asp:BoundField HeaderText="Postal Code" DataField="PostalCode" />
        </Fields>  
    </asp:DetailsView>
   
</form>

第二個範例顯示 和 Updating 事件的處理程式SelectedSelected事件處理程式會串行化 物件,其中包含從 Employee 數據表擷取的數據。 串行化物件會儲存在檢視狀態中。 事件處理程式會 Updating 以檢視狀態還原串行化物件,其中包含正在更新之數據記錄的原始數據。 包含原始數據的物件會當做參數傳遞至 Update 方法。 原始數據必須傳遞至資料庫,以便用來檢查資料是否已由另一個進程修改。

public void EmployeeUpdating(object source, ObjectDataSourceMethodEventArgs e)
{
    DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));

    String xmlData = ViewState["OriginalEmployee"].ToString();
    XmlReader reader = XmlReader.Create(new StringReader(xmlData));
    Employee originalEmployee = (Employee)dcs.ReadObject(reader);
    reader.Close();

    e.InputParameters.Add("originalEmployee", originalEmployee);
}

public void EmployeeSelected(object source, ObjectDataSourceStatusEventArgs e)
{
    if (e.ReturnValue != null)
    {
        DataContractSerializer dcs = new DataContractSerializer(typeof(Employee));
        StringBuilder sb = new StringBuilder();
        XmlWriter writer = XmlWriter.Create(sb);
        dcs.WriteObject(writer, e.ReturnValue);
        writer.Close();

        ViewState["OriginalEmployee"] = sb.ToString();
    }
}
Public Sub EmployeeUpdating(ByVal source As Object, ByVal e As ObjectDataSourceMethodEventArgs)
    Dim dcs As New DataContractSerializer(GetType(Employee))
    Dim xmlData As String
    Dim reader As XmlReader
    Dim originalEmployee As Employee

    xmlData = ViewState("OriginalEmployee").ToString()
    reader = XmlReader.Create(New StringReader(xmlData))
    originalEmployee = CType(dcs.ReadObject(reader), Employee)
    reader.Close()

    e.InputParameters.Add("originalEmployee", originalEmployee)
End Sub

Public Sub EmployeeSelected(ByVal source As Object, ByVal e As ObjectDataSourceStatusEventArgs)
    If e.ReturnValue IsNot Nothing Then
        Dim dcs As New DataContractSerializer(GetType(Employee))
        Dim sb As New StringBuilder()
        Dim writer As XmlWriter
        writer = XmlWriter.Create(sb)
        dcs.WriteObject(writer, e.ReturnValue)
        writer.Close()

        ViewState("OriginalEmployee") = sb.ToString()
    End If
End Sub

第三個範例顯示與 Northwind 資料庫互動的數據存取類別。 類別會使用 LINQ 來查詢及更新 Employees 數據表。 此範例需要代表 Northwind 資料庫和 Employees 數據表的 LINQ to SQL 類別。 如需詳細資訊,請參閱 如何:在 Web 專案中建立 LINQ to SQL 類別

public class EmployeeLogic
{
    public static Array GetFullNamesAndIDs()
    {
        NorthwindDataContext ndc = new NorthwindDataContext();

        var employeeQuery =
            from e in ndc.Employees
            orderby e.LastName
            select new { FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID };

        return employeeQuery.ToArray();
    }

    public static Employee GetEmployee(int empID)
    {
        if (empID < 0)
        {
            return null;
        }
        else
        {
            NorthwindDataContext ndc = new NorthwindDataContext();
            var employeeQuery =
                from e in ndc.Employees
                where e.EmployeeID == empID
                select e;

            return employeeQuery.Single();
        }
    }
 
    public static void UpdateEmployeeAddress(Employee originalEmployee, string address, string city, string postalcode)
    {
        NorthwindDataContext ndc = new NorthwindDataContext();
        ndc.Employees.Attach(originalEmployee, false);
        originalEmployee.Address = address;
        originalEmployee.City = city;
        originalEmployee.PostalCode = postalcode;
        ndc.SubmitChanges();
    }
}
Public Class EmployeeLogic
    Public Shared Function GetFullNamesAndIDs() As Array
        Dim ndc As New NorthwindDataContext()

        Dim employeeQuery = _
            From e In ndc.Employees _
            Order By e.LastName _
            Select FullName = e.FirstName + " " + e.LastName, EmployeeID = e.EmployeeID

        Return employeeQuery.ToArray()
    End Function

    Public Shared Function GetEmployee(ByVal empID As Integer) As Employee

        If (empID < 0) Then
            Return Nothing
        Else
            Dim ndc As New NorthwindDataContext()
            Dim employeeQuery = _
                From e In ndc.Employees _
                Where e.EmployeeID = empID _
                Select e

            Return employeeQuery.Single()
        End If
    End Function

    Public Shared Sub UpdateEmployeeAddress(ByVal originalEmployee As Employee, ByVal address As String, ByVal city As String, ByVal postalcode As String)

        Dim ndc As New NorthwindDataContext()
        ndc.Employees.Attach(originalEmployee, False)
        originalEmployee.Address = address
        originalEmployee.City = city
        originalEmployee.PostalCode = postalcode
        ndc.SubmitChanges()
    End Sub
End Class

備註

控件 ObjectDataSource 假設 屬性所 UpdateMethod 識別的方法會一次執行一個更新,而不是批次中的更新。

屬性UpdateMethod會委派給UpdateMethodObjectDataSource 控件相關聯之 ObjectDataSourceView 對象的屬性。

請確定為 ObjectDataSource 集合中 UpdateParameters 控件設定的參數名稱符合 select 方法所傳回的數據行名稱。

物件存留期

屬性所 UpdateMethod 識別的方法可以是 Visual Basic) 方法中的實例方法或 static (Shared 。 如果是實例方法,每次呼叫 屬性所 UpdateMethod 指定的方法時,都會建立並終結商業物件。 您可以在呼叫 屬性所UpdateMethod指定的 方法之前,先處理 ObjectCreatedObjectCreating 事件以使用商業物件。 您也可以處理 ObjectDisposing 呼叫 屬性所 UpdateMethod 指定之 方法之後所引發的事件。 如果商業物件實作 IDisposable 介面,則會 Dispose 在終結物件之前呼叫 方法。 如果在 Visual Basic) 中 (方法static,則永遠不會建立商業物件,而且您無法處理 ObjectCreatedObjectCreatingObjectDisposing 事件。Shared

參數合併

參數會從三個來源新增至 UpdateParameters 集合:

  • 從數據綁定控件,在運行時間。

  • UpdateParameters以宣告方式從專案。

  • Updating從事件處理程式,以程序設計方式。

首先,從數據綁定控件產生的任何參數都會新增至 UpdateParameters 集合。 例如,如果ObjectDataSource控件系結至GridView具有 數據行Name和的控件,則 和Number的參數NameNumber會加入至集合中。 參數的確切名稱取決於 OldValuesParameterFormatString 屬性。 這些參數的資料類型為 string。 接下來,會新增專案中列出的 UpdateParameters 參數。 如果找到元素中的 UpdateParameters 參數與集合中 UpdateParameters 已存在的參數名稱相同,則會修改現有的參數,以符合 元素中指定的 UpdateParameters 參數。 一般而言,這會用來修改 參數中的數據型別。 最後,您可以程序設計方式在 事件中 Updating 新增和移除參數,這會在執行 方法之前 Update 發生。 方法會在合併參數之後解析。 下一節會討論方法解析。

重要

您應該驗證您從用戶端收到的任何參數值。 運行時間只會將參數值取代為 UpdateMethod 屬性。

方法解析

Update呼叫 方法時,來自數據綁定控件的數據欄位、以宣告方式在 元素中UpdateParameters建立的參數,以及事件處理程式中Updating新增的參數都會合併。 (如需詳細資訊,請參閱上一節。) ObjectDataSource 控件接著會嘗試尋找要呼叫的方法。 首先,它會尋找具有 屬性中所 UpdateMethod 指定名稱的一或多個方法。 如果找不到相符專案, InvalidOperationException 則會擲回例外狀況。 如果找到相符專案,則會尋找相符的參數名稱。 例如,假設 屬性所 TypeName 指定的型別有兩個名為 UpdateARecord的方法。 其中一UpdateARecord個參數為 ,另一個參數則有兩個IDUpdateARecord參數, NameNumberUpdateParameters如果集合只有一個名為 ID的參數,UpdateARecord則只會ID呼叫具有 參數的方法。 無法檢查參數的類型,無法解析方法。 參數的順序並不重要。

DataObjectTypeName如果已設定 屬性,方法會以不同方式解析。 會 ObjectDataSource 尋找名稱在 屬性中指定的 UpdateMethod 方法,該方法會採用 屬性中所 DataObjectTypeName 指定類型的一個參數。 在此情況下,參數的名稱並不重要。

適用於

另請參閱