注释
数据集和相关类是 2000 年代初的旧 .NET Framework 技术,使应用程序能够在应用程序与数据库断开连接时处理内存中的数据。 这些技术对于使用户能够修改数据并将更改保留回数据库的应用程序特别有用。 尽管数据集被证明是非常成功的技术,但我们建议新的 .NET 应用程序使用 Entity Framework Core。 Entity Framework 提供了一种更自然的方式来将表格数据用作对象模型,并且具有更简单的编程接口。
本文介绍如何在 .NET Framework 数据集的表中查询和编辑数据。 可以编辑数据表中的数据,就像编辑任何数据库中的表一样。 可以在表中插入、更新和删除记录。 在数据绑定窗体中,可以指定哪些字段是用户可编辑的。
在这些情况下,数据绑定基础结构处理所有更改跟踪,以便可以将更改发送回数据库。 如果以编程方式编辑数据并希望将更改发送回数据库,则必须使用执行更改跟踪的对象和方法。
除了更改实际数据之外,您还可以通过查询 DataTable 来返回特定的数据行。 例如,可以查询各个行、原始或建议的行版本、已更改的行或包含错误的行。
先决条件
若要使用 Visual Studio 查询和编辑 .NET Framework 数据集中的数据,需要:
- 在 Visual Studio 中安装的 .NET 桌面开发和数据存储和处理工作负载。 有关详细信息,请参阅 修改 Visual Studio。
- C# 或 Visual Basic (VB) .NET Framework 项目已创建。
- 从 SQL Server Express LocalDB 数据库创建的数据集。
编辑数据集中的行
若要编辑现有 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
上调用NewRow方法来向数据集添加新记录。 然后,将行添加到 DataRow 集合(Rows)。
NorthwindDataSet.CustomersRow newCustomersRow =
northwindDataSet1.Customers.NewCustomersRow();
newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";
northwindDataSet1.Customers.Rows.Add(newCustomersRow);
从数据表中删除记录
可以通过调用DataRowCollection的Remove方法删除DataRow,或者通过调用DataRow对象的Delete方法删除DataRow。
该方法 Remove 从集合中删除该行。 如果应用程序不需要将更新发送回数据源,可以通过直接访问数据行集合 Remove来删除记录。
相反,该方法 Delete 实际上不会删除该方法 DataRow,而是将其标记为删除。 当你调用方法AcceptChanges时,将发生实际删除。 可以在实际删除行之前以编程方式检查哪些行被标记为删除。
若要保留数据集需要传送至数据源的更新信息,请使用Delete方法移除数据表中的DataRow。 如果您的应用程序使用TableAdapter
或DataAdapter方法,Update
方法将删除具有RowState
Deleted
的行。
以下示例演示如何调用 Delete 方法以将表中的第一行 Customers
标记为已删除:
注释
如果获取 a DataRowCollection的 count 属性,则生成的计数包括标记为要删除的记录。 若要获取未标记为删除的记录的准确计数,可以循环访问集合并查看 RowState 每个记录的属性。 标记为删除的记录有一个 RowStateDeleted。 或者,可以创建数据集的数据视图,该视图基于行状态筛选并从中获取 count 属性。
确定是否存在已更改的行
对数据集中的记录进行更改时,将存储有关这些更改的信息,直到提交这些更改。 当调用数据集或数据表的AcceptChanges
方法,或者当调用Update
或数据适配器的TableAdapter
方法时,会提交更改。
在每个数据行中,更改被以两种方式跟踪:
每个更改的数据行都包含多个版本。 其中包括 DataRowVersion 更改前的原始版本和更改后的当前版本。 虽然更改处于挂起状态,但你可以响应事件 RowChanging ,但也可以使用第三个建议的版本。
若要检查更改的行,请调用 HasChanges 数据集的方法。 如果数据集中发生了更改,该方法将 true
返回。 确定存在更改后,可以调用DataSet或DataTable的方法GetChanges
以返回一组已更改的行。
下面的示例演示如何检查方法中的 HasChanges 返回值,以检测是否有任何更改的 NorthwindDataset1
行。
if (northwindDataSet1.HasChanges())
{
// Changed rows were detected, add appropriate code.
}
else
{
// No changed rows were detected, add appropriate code.
}
确定更改的类型
可以通过将枚举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
如果数据集的属性是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.
}
}
}
}
}
}
相关内容
- Visual Studio 中的 数据集工具