使用 .NET Framework 編輯資料集中的資料
注意
資料集和相關類別是 2000 年代初的舊版 .NET Framework 技術,可讓應用程式在應用程式與資料庫中斷連線時使用記憶體中的資料。 這些技術特別適用於可讓使用者修改資料並將變更保存回資料庫的應用程式。 雖然已證明資料集是非常成功的技術,但建議新的 .NET 應用程式使用 Entity Framework Core。 Entity Framework 提供更自然的方式,將表格式資料作為物件模型使用,而且具有更簡單的程式設計介面。
您可以編輯資料表中的資料,如同在任何資料庫中編輯資料表中的資料一樣。 此程序可以包含資料表中的插入、更新和刪除記錄。 在資料繫結表單中,您可以指定哪些是使用者可編輯的欄位。 在這些情況下,資料繫結基礎結構會處理所有變更追蹤,以便稍後將變更傳回資料庫。 如果您以程式設計方式對資料進行編輯,且想要將這些變更傳回資料庫,則必須使用為您執行變更追蹤的物件和方法。
除了變更實際資料之外,您也可以查詢 DataTable 以傳回特定資料列。 例如,您可以查詢個別的資料列、特定資料列版本 (原始和建議)、已變更的資料列,或有錯誤的資料列。
若要編輯資料集中的資料列
若要編輯 DataTable 中的現有資料列,您必須找出您要編輯的 DataRow,然後將更新的值指派給所需的資料行。
如果您不知道所要編輯的資料列索引,請使用 FindBy
方法來搜尋主索引鍵:
NorthwindDataSet.CustomersRow customersRow =
northwindDataSet1.Customers.FindByCustomerID("ALFKI");
customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";
如果您知道資料列索引,則可以存取並編輯資料列,如下所示:
northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";
若要將新資料列插入資料集
使用資料繫結控制項的應用程式通常會透過 BindingNavigator 控制項上的 [新增] 按鈕來新增記錄。
若要手動將新記錄新增至資料集,請在 DataTable 上呼叫方法,以建立新的資料列。 然後,將資料列新增至 DataTable 的 DataRow 集合 (Rows):
NorthwindDataSet.CustomersRow newCustomersRow =
northwindDataSet1.Customers.NewCustomersRow();
newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";
northwindDataSet1.Customers.Rows.Add(newCustomersRow);
若要保留資料集必須傳送更新至資料來源的資訊,請使用 Delete 方法來移除資料表中的資料列。 例如,如果您的應用程式使用 TableAdapter (或 DataAdapter),TableAdapter 的 Update
方法會刪除資料庫 (具有 Deleted 的 RowState) 中的資料列。
如果您的應用程式不必將更新傳回資料來源,您可以直接存取資料列集合 (Remove) 來移除記錄。
若要從資料表中刪除記錄
-
此方法不會實際移除記錄。 相反地,其會標示要刪除的記錄。
注意
如果您取得 DataRowCollection 的 count 屬性,產生的計數會包含已標示要刪除的記錄。 若要取得未標示要刪除記錄的準確計數,您可以在集合之間執行迴圈,以查看每個記錄的 RowState 屬性。 (標示要刪除的記錄為 Deleted 的 RowState。)或者,您可以建立資料集的資料檢視,以根據資料列狀態進行篩選,並從中取得 count 屬性。
下列範例示範如何呼叫 Delete 方法,將 Customers
資料表中的第一個資料列標示為已刪除:
判斷是否有變更的資料列
對資料集中的記錄進行變更時,系統會儲存這些變更的相關資訊,直到您認可這些變更為止。 當您呼叫資料集或資料表的AcceptChanges
方法,或呼叫 TableAdapter 或資料配接器的 Update
方法時,您會認可變更。
每個資料列中都會以兩種方式追蹤變更:
每個資料列都包含與其 RowState 相關的資訊 (例如 Added、Modified、Deleted 或 Unchanged)。
每個已變更的資料列都包含該資料列的多個版本 (DataRowVersion)、原始版本 (變更之前) 和目前版本 (變更之後)。 在變更擱置期間 (您可以回應 RowChanging 事件的時間),第三個版本 (建議的版本) 也可供使用。
如果已在資料集中進行變更,資料集的 HasChanges 方法會傳回 true
。 判斷已變更的資料列存在之後,您即可呼叫 DataSet 或 DataTable 的 GetChanges
方法,以傳回一組已變更的資料列。
判斷是否已對任何資料列進行變更
- 呼叫資料集的 HasChanges 方法,以檢查變更的資料列。
下列範例示範如何檢查從 HasChanges 方法傳回的值,以偵測名為 NorthwindDataset1
的資料集中是否有任何變更的資料列:
if (northwindDataSet1.HasChanges())
{
// Changed rows were detected, add appropriate code.
}
else
{
// No changed rows were detected, add appropriate code.
}
判斷變更的類型
您也可以將 DataRowState 列舉中的值傳遞至 HasChanges 方法,來檢查資料集中所做的變更類型。
若要判斷已對資料列進行的變更是什麼類型
- 將 DataRowState 值傳遞至 HasChanges 方法。
下列範例示範如何檢查名為 NorthwindDataset1
的資料集,以判斷是否已將任何新的資料列新增至其中:
if (northwindDataSet1.HasChanges(DataRowState.Added))
{
// New rows have been added to the dataset, add appropriate code.
}
else
{
// No new rows have been added to the dataset, add appropriate code.
}
若要找出有錯誤的資料列
使用個別的資料行和資料列時,您可能會遇到錯誤。 您可以檢查 HasErrors
屬性,判斷 DataSet、DataTable 或 DataRow 中是否存在錯誤。
請檢查
HasErrors
屬性,查看資料集中是否有任何錯誤。如果
HasErrors
屬性為true
,請逐一查看資料表的集合,然後逐一查看資料列,以尋找具有錯誤的資料列。
private void FindErrors()
{
if (dataSet1.HasErrors)
{
foreach (DataTable table in dataSet1.Tables)
{
if (table.HasErrors)
{
foreach (DataRow row in table.Rows)
{
if (row.HasErrors)
{
// Process error here.
}
}
}
}
}
}