共用方式為


使用 Visual Studio 將物件系結為 .NET Framework 應用程式中的數據源

備註

類別 DataSet 和相關類別是 2000 年代初的舊版 .NET Framework 技術,可讓應用程式在應用程式與資料庫中斷連線時使用記憶體中的數據。 這些技術特別適用於可讓使用者修改數據並將變更保存回資料庫的應用程式。 雖然數據集是經過證實的成功技術,但新 .NET 應用程式的建議方法是使用 Entity Framework Core。 Entity Framework 提供更自然的方式,以表格式數據作為物件模型使用,而且具有更簡單的程序設計介面。

Visual Studio 提供設計時間工具,以使用自定義物件做為應用程式中的數據源。 當您想要將數據從資料庫儲存在系結至 UI 控件的物件中時,建議的方法是使用 Entity Framework 來產生類別或類別。 Entity Framework 會自動產生所有樣板變更追蹤程式碼,這意味著當您在 DbSet 物件上呼叫 AcceptChanges 時,本機物件中的任何變更都會自動儲存至資料庫。 如需詳細資訊,請參閱 Entity Framework 檔

小提示

只有在您的應用程式已經以數據集為基礎時,才應該考慮本文中對象系結的方法。 如果您已經熟悉數據集,而且您正在處理的數據表格式,而且不會太複雜或太大,您也可以使用這些方法。 如需更簡單的範例,使用 DataReader 直接將數據載入物件,並手動更新 UI 而不需數據系結,請參閱 使用 ADO.NET 建立簡單的數據應用程式

物件需求

自定義物件在 Visual Studio 中使用資料設計工具的唯一需求是物件至少需要一個公用屬性。

一般而言,自定義物件不需要任何特定的介面、建構函式或屬性作為應用程式的數據源。 不過,如果您想要將物件從 [數據源 ] 視窗拖曳至設計介面以建立數據綁定控件,而且如果對象實作 ITypedListIListSource 介面,對象必須有默認建構函式。 否則,Visual Studio 無法具現化數據源物件,而且當您將專案拖曳至設計介面時,它會顯示錯誤。

使用自定義對象作為數據源的範例

雖然使用物件做為數據源時,實作應用程式邏輯的方式不計其數,但對於 SQL 資料庫而言,有幾個標準作業可以使用 Visual Studio 產生的 TableAdapter 物件來簡化。 此頁面說明如何使用 TableAdapters 實作這些標準進程。 它不是用來建立自定義物件的指南。 例如,不論物件或應用程式邏輯的特定實作為何,您通常會執行下列標準作業:

  • 將數據載入物件(通常是從資料庫)。

  • 建立具型別的物件集合。

  • 將物件加入集合中,以及從集合中移除物件。

  • 在表單上向使用者顯示對象數據。

  • 變更/編輯 物件中的數據。

  • 將數據從物件儲存回資料庫。

將數據載入物件

在此範例中,您會使用 TableAdapters 將數據載入物件。 根據預設,TableAdapters 會使用兩種方法建立,以從資料庫擷取數據並填入數據表。

  • 方法 TableAdapter.Fill 會將傳回的數據填入現有的數據表。

  • 方法會傳回一個填入數據的新數據表TableAdapter.GetData

使用數據載入自定義物件最簡單的方式是呼叫 TableAdapter.GetData 方法、迴圈查看傳回之數據表中的數據列集合,以及填入每個物件中的值。 您可以建立 GetData 方法,針對新增至 TableAdapter 的任何查詢傳回填入的數據表。

備註

Visual Studio 預設會將 TableAdapter 命名為查詢 FillGetData 但您可以將這些名稱變更為任何有效的方法名稱。

下列範例示範如何迴圈查看數據表中的數據列,以及使用數據填入 物件:

private void LoadCustomers()
{
    NorthwindDataSet.CustomersDataTable customerData = 
        customersTableAdapter1.GetTop5Customers();
    
    foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
    {
        Customer currentCustomer = new Customer();
        currentCustomer.CustomerID = customerRow.CustomerID;
        currentCustomer.CompanyName = customerRow.CompanyName;

        if (customerRow.IsAddressNull() == false)
        {
            currentCustomer.Address = customerRow.Address;
        }

        if (customerRow.IsCityNull() == false)
        {
            currentCustomer.City = customerRow.City;
        }

        if (customerRow.IsContactNameNull() == false)
        {
            currentCustomer.ContactName = customerRow.ContactName;
        }

        if (customerRow.IsContactTitleNull() == false)
        {
            currentCustomer.ContactTitle = customerRow.ContactTitle;
        }

        if (customerRow.IsCountryNull() == false)
        {
            currentCustomer.Country = customerRow.Country;
        }

        if (customerRow.IsFaxNull() == false)
        {
            currentCustomer.Fax = customerRow.Fax;
        }

        if (customerRow.IsPhoneNull() == false)
        {
            currentCustomer.Phone = customerRow.Phone;
        }

        if (customerRow.IsPostalCodeNull() == false)
        {
            currentCustomer.PostalCode = customerRow.PostalCode;
        }

        if (customerRow.IsRegionNull() == false)
        {
            currentCustomer.Region = customerRow.Region;
        }

        LoadOrders(currentCustomer);
        customerBindingSource.Add(currentCustomer);
    }
}

建立具型別的物件集合

您可以為物件建立集合類別,或使用 BindingSource 元件自動提供的具型別集合。

當您建立物件的自訂集合類別時,建議您繼承自 BindingList<T>。 這個泛型類別提供管理集合的功能,以及能夠引發事件,以將通知傳送至 Windows Forms 中的數據系結基礎結構。

BindingSource 中自動生成的集合會使用 BindingList<T> 來建立具類型的集合。 如果您的應用程式不需要其他功能,您可以在BindingSource中維護您的集合。 如需詳細資訊,請參閱 List 類別的 BindingSource 屬性。

備註

如果您的集合需要基底實作未提供的功能,您應該建立自定義集合,以便可以根據需要將功能新增至類別。

下列程式代碼示範如何為物件的強型別集合 Order 建立 類別:

/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
    // Add any additional functionality required by your collection.
}

將物件新增至集合

您可以呼叫 Add 自訂集合類別或 BindingSource的方法,將 物件新增至集合。

備註

Add方法在您繼承自 BindingList<T>時會自動為您的自定義集合提供。

下列程式代碼示範如何將物件新增至BindingSource具型別的集合:

Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);

下列程式代碼示範如何將 物件加入繼承自 BindingList<T>的具型別集合:

備註

在此範例中,Orders 集合是 Customer 物件的屬性。

Order currentOrder = new Order();
currentCustomer.Orders.Add(currentOrder);

從集合中移除物件

您可以呼叫Remove自定義集合類別或 的 BindingSourceRemoveAt 方法,從集合中移除物件。

備註

當您繼承自 BindingList<T> 時,RemoveRemoveAt 方法將自動為您的自定義集合提供。

下列程式碼顯示如何在BindingSource中,使用RemoveAt方法,從型別化集合中尋找和移除物件:

int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);

向使用者顯示對象數據

若要向使用者顯示物件中的數據,請使用 [數據源組態 精靈] 建立對象數據源,然後從 [ 數據源 ] 視窗將整個物件或個別屬性拖曳到表單上。

修改物件中的數據

若要編輯系結至 Windows Forms 控件之自定義物件中的數據,只需編輯綁定控件中的數據(或直接在對象的屬性中)。 數據系結架構會更新 物件中的數據。

如果您的應用程式需要追蹤變更,以及將建議的變更回復至其原始值,則必須在物件模型中實作這項功能。 如需資料表如何追蹤建議變更的範例,請參閱 DataRowStateHasChangesGetChanges

將物件中的數據儲存回資料庫

將數據從對象傳遞至 TableAdapter 的 DBDirect 方法,將數據儲存回資料庫。

Visual Studio 會建立可以直接對資料庫執行的 DBDirect 方法。 這些方法不需要 DataSet 或 DataTable 物件。

TableAdapter DBDirect 方法 說明
TableAdapter.Insert 將新記錄新增至資料庫,讓您以方法參數的形式傳入個別的數據行值。
TableAdapter.Update 更新資料庫中的現有記錄。 Update 方法會採用原始和新的數據行值作為方法參數。 原始值可用來尋找原始記錄,而新值則用來更新該記錄。

方法 TableAdapter.Update 也可用來將 數據集中的變更調和回資料庫,方法是將 DataSetDataTableDataRow或陣列 DataRow當做方法參數。
TableAdapter.Delete 根據傳入做為方法參數的原始數據行值,從資料庫刪除現有的記錄。

若要儲存物件集合中的資料,請遍歷物件集合(例如,使用 for-next 迴圈)。 使用 TableAdapter 的 DBDirect 方法,將每個物件的值傳送至資料庫。

下列範例示範如何使用 TableAdapter.Insert DBDirect 方法,將新的客戶直接新增至資料庫:

private void AddNewCustomers(Customer currentCustomer)
{
    customersTableAdapter.Insert( 
        currentCustomer.CustomerID, 
        currentCustomer.CompanyName, 
        currentCustomer.ContactName, 
        currentCustomer.ContactTitle, 
        currentCustomer.Address, 
        currentCustomer.City, 
        currentCustomer.Region, 
        currentCustomer.PostalCode, 
        currentCustomer.Country, 
        currentCustomer.Phone, 
        currentCustomer.Fax);
}