共用方式為


建立 ObjectDataSource 控制項來源物件

更新:2007 年 11 月

ObjectDataSource 控制項的來源物件會依 ObjectDataSource 控制項的要求,在基礎資料來源中擷取資料並執行更新。ObjectDataSource 控制項的來源物件可以是 ObjectDataSource 控制項可建立執行個體的類別,或者是會公開 (Expose) ObjectDataSource 控制項可以呼叫之公用 static (在 Microsoft Visual Basic 中為 Shared) 方法的類別。

如需來源物件範例以及包括會使用來源物件之 ObjectDataSource 控制項的 ASP .NET 網頁範例,請參閱 ObjectDataSource 來源物件範例ObjectDataSource 強型別來源物件範例

建立物件

如果物件所具備的執行個體方法不是 static 方法 (在 Visual Basic 中是 Shared),則 ObjectDataSource 控制項會建立來源物件的執行個體、呼叫指定的方法並處置 (Dispose) 單一要求範圍內的所有物件執行個體。因此,您的物件必須是沒有狀態 (Stateless)。也就是說,您的物件應該在單一要求的時間長度內,取得和釋放所有需要的資源。

您可以透過處理 ObjectDataSource 控制項的 ObjectCreating 事件,控制建立來源物件的方式。您可以建立來源物件的執行個體,然後將 ObjectDataSourceEventArgs 類別的 ObjectInstance 屬性 (Property) 設定為該執行個體。ObjectDataSource 控制項就會使用在 ObjectCreating 事件中建立的執行個體,而不會自行建立執行個體。

指定類別建構函式

如果 ObjectDataSource 控制項的來源物件會公開可以呼叫來擷取和修改資料的公用 static 方法 (在 Visual Basic 中為 Shared),則 ObjectDataSource 控制項將直接呼叫這些方法。如果 ObjectDataSource 控制項必須建立來源物件的執行個體才能進行方法呼叫,則物件必須包含不需使用參數的公用建構函式。ObjectDataSource 控制項會在建立來源物件的新執行個體時,呼叫此建構函式。

如果來源物件不包含沒有參數的公用建構函式,您可以建立將由 ObjectCreating 事件中 ObjectDataSource 控制項所使用的來源物件執行個體,如本主題稍早的「建立物件」所述。

指定物件方法

ObjectDataSource 控制項的來源物件可能包含用來選取、插入、更新或刪除資料之任意數目的方法。這些方法是由 ObjectDataSource 控制項依據方法名稱進行呼叫,如同使用 ObjectDataSource 控制項的 SelectMethodInsertMethodUpdateMethodDeleteMethod 屬性,以及在所選動作之相關參數集合中的參數名稱進行識別一樣。如需詳細資訊,請參閱使用參數和 ObjectDataSource 控制項

來源物件也可以包含選擇性 SelectCount 方法 (由 ObjectDataSource 控制項使用 SelectCountMethod 屬性識別),這個方法會傳回資料來源的物件總計數。ObjectDataSource 控制項會在已呼叫 Select 方法之後呼叫 SelectCount 方法,進而擷取資料來源的記錄總數以供分頁時使用。

注意事項:

如果您的物件支援分頁,強烈建議您實作 SelectCount 方法。這樣可以將資料繫結控制項 (例如 GridView 控制項) 必須要求擷取資料頁的資料錄數量減到最少。如果總資料列計數由資料來源物件提供,資料繫結控制項則一次只會為每個頁面要求單一資料列頁面。如果沒有提供總資料列計數,資料繫結控制項就必須要求資料來源中的所有資料列 (從要求的資料頁的第一個資料列開始),並捨棄任何一個不在目前頁面中的資料列。

使用強型別物件

您的來源物件可以根據來自資料來源的資料,傳回和接收強型別物件。ObjectDataSource 控制項會使用 DataObjectTypeName 屬性來識別這些物件的型別。在這個案例中,不會傳遞一個或多個參數至方法,而是會傳遞一個彙總 (Aggregate) 所有參數值的物件。如需如何將特定物件型別當做來源物件方法之參數傳遞的詳細資訊,請參閱使用參數和 ObjectDataSource 控制項

ObjectDataSource 控制項的 ConflictDetection 屬性設為 CompareAllValues 值,而且 OldValuesParameterFormatString 屬性設為可區別原始值和目前值的參數值時,ObjectDataSource 將執行下列動作:

  • 從同時採用目前值和原始值之參數的來源物件呼叫 Update 方法。

  • 從採用原始值之參數的來源物件呼叫 Delete 方法。

使用強型別物件時,ObjectDataSource 控制項將從來源物件呼叫 Update 方法,而這個來源物件同時採用了以目前值填入 (Populate) 的強型別物件,以及使用原始值填入的強型別物件。不過,當 ObjectDataSource 控制項呼叫 Delete 方法並傳遞強型別物件時,它會呼叫採用單一強型別物件做為參數的方法,而不管 ConflictDetectionOldValuesParameterFormatString 設定為何。如果 ConflictDetection 屬性設為 OverwriteChanges 值,則只會以目前的主索引鍵值,填入傳遞至 Delete 方法的物件 (物件的其他屬性為 null)。如果 ConflictDetection 屬性設為 CompareAllValues 值,則會以原始主索引鍵值和其餘物件屬性的原始值,填入傳遞至 Delete 方法的物件。

使用設計工具

您可以選擇套用屬性 (Attribute) 至來源物件,這些屬性可將來源物件當做資料物件描述給設計工具,例如 Microsoft Visual Web Developer Web 開發工具。對於使用設計工具以特別識別那些物件方法是用於選取、插入、更新和刪除作業的程式開發人員來說,這麼做可改善他們的使用經驗。

若要將物件識別為 ObjectDataSource 控制項的來源物件,請使用 DataObjectAttribute 屬性,如下列範例所示。

<DataObject(True)> _
Public Class NorthwindEmployee 
[DataObject(true)]
public class NorthwindEmployee

若要將某個方法識別為資料物件方法,請使用 DataObjectMethodAttribute 屬性。當您套用 DataObjectMethodAttribute 屬性時,請納入其中一個 DataObjectMethodType 列舉值以識別方法的型別 (選取、插入、更新或刪除)。下列程式碼範例會使用 DataObjectMethodAttribute 屬性,將方法識別為 Delete 方法。

<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Shared Function DeleteEmployee(EmployeeID As Integer) As Boolean

  If Not _initialized Then Initialize()

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim cmd  As SqlCommand     = New SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn)  
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID

  Try
    conn.Open()

    If cmd.ExecuteNonQuery() <> 0 Then _
      Return False
  Catch e As SqlException
    ' Handle exception.
  Finally
    conn.Close()
  End Try

  Return True
End Function
[DataObjectMethod(DataObjectMethodType.Delete)]
public static bool DeleteEmployee(int EmployeeID)
{
  if (!_initialized) { Initialize(); }

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlCommand    cmd  = new SqlCommand("DELETE FROM Employees WHERE EmployeeID = @EmployeeID", conn);  
  cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = EmployeeID;

  try
  {
    conn.Open();

    if (cmd.ExecuteNonQuery() == 0)
      return false;
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  return true;
}

請參閱

概念

ObjectDataSource 來源物件範例

使用參數和 ObjectDataSource 控制項

參考

ObjectDataSource Web 伺服器控制項概觀