DataSet..::.Merge 方法 (DataSet)

本文详细介绍了如何使用DataSet的Merge方法合并两个具有类似架构的数据集。包括处理数据更改、更新数据源和刷新现有数据集的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将指定的 DataSet 及其架构合并到当前 DataSet 中。

命名空间:   System.Data
程序集:  System.Data (在 System.Data.dll 中)

C#
public
 void
 Merge(
DataSet dataSet
)
参数
dataSet
类型:
System.Data. . :: . DataSet


其数据和架构将被合并的 DataSet

异常条件
ConstraintException

无法启用一个或多个约束。

ArgumentNullException

dataSetnull Nothing nullptr null 引用(在 Visual Basic 中为 Nothing

Merge 方法用于合并架构大致相似的两个 DataSet 对象。合并在客户端应用程序上通常用于将数据源中最近的更改合并到现有的

DataSet 中。这使客户端应用程序能够拥有用数据源中的最新数据刷新的
DataSet


通常在一系列过程的末尾调用
Merge
方法,这些过程涉及验证更改、消除错误、使用更改更新数据源并最后刷新现有的
DataSet


在客户端应用程序中,通常有这样一个按钮,用户可以单击它来收集已更改的数据并对它进行验证,然后将它发送回中间层组件。在这种情况下,将首先调用
GetChanges
方法。该方法返回另一个为验证和合并而优化的
DataSet
。第二个
DataSet
对象只包含已更改的
DataTable

DataRow
对象,结果产生初始
DataSet
的子集。该子集通常较小,因此可以更有效率地传递回中间层组件。然后,中间层组件通过存储过程使用更改来更新初始数据源。然后,中间层可以发送回一个新的
DataSet
,其中包含数据源中的初始数据和最新数据(通过再次运行初始查询);或者它可以发送回包含从数据源对其进行的所有更改的子集。(例如,如果数据源自动创建唯一主键值,则可以将这些值传播回客户端应用程序。)在哪一种情况下都可以使用
Merge
方法将返回的
DataSet
合并回客户端应用程序的初始
DataSet


当调用
Merge
方法时,由于架构可能已更改,因此对两个
DataSet
对象的架构进行比较。例如,在企业对企业的情况下,可能已经通过自动过程将新列添加到 XML 架构中。如果源
DataSet
包含目标中缺少的架构元素(已添加的
DataColumn
对象),则可以通过将 missingSchemaAction 参数设置为 MissingSchemaAction.Add 将该架构元素添加到目标中。在这种情况下,合并的
DataSet
包含已添加的架构和数据。


合并架构之后合并数据。


当将新的源
DataSet
合并到目标中时,
DataRowState
值为 UnchangedModifiedDeleted 的任何源行都会与具有相同主键值的目标行进行匹配。DataRowState 值为 Added 的源行匹配那些与新源行具有相同主键值的新目标行。


合并过程中将禁用约束。如果在合并结束时无法启用任何约束,则会在禁用约束的同时生成
ConstraintException
并保留合并的数据。这种情况下,
EnforceConstraints
属性将设置为 false ,并且所有无效行都会标记为出错。在试图将
EnforceConstraints
属性重置为 true 之前,必须消除这些错误。

下面的示例针对
DataSet 使用

GetChanges 、Update 和
Merge
方法。





C#




private
 void
 DemonstrateMerge() 
{
// Create a DataSet with one table, two columns, and three rows.
DataSet dataSet = new DataSet("dataSet" );
DataTable table = new DataTable("Items" );
DataColumn idColumn = new DataColumn("id" ,
Type.GetType("System.Int32" ));
idColumn.AutoIncrement=true ;
DataColumn itemColumn = new DataColumn("Item" ,
Type.GetType("System.Int32" ));

// DataColumn array to set primary key.
DataColumn[] keyColumn= new DataColumn[1];
DataRow row;

// Create variable for temporary DataSet.
DataSet changeDataSet;

// Add columns to table, and table to DataSet.
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
dataSet.Tables.Add(table);

// Set primary key column.
keyColumn[0]= idColumn;
table.PrimaryKey=keyColumn;

// Add ten rows.
for (int i = 0; i <10;i++)
{
row=table.NewRow();
row["Item" ]= i;
table.Rows.Add(row);
}

// Accept changes.
dataSet.AcceptChanges();
PrintValues(dataSet, "Original values" );

// Change two row values.
table.Rows[0]["Item" ]= 50;
table.Rows[1]["Item" ]= 111;

// Add one row.
row=table.NewRow();
row["Item" ]=74;
table.Rows.Add(row);

// Insert code for error checking. Set one row in error.
table.Rows[1].RowError= "over 100" ;
PrintValues(dataSet, "Modified and New Values" );
// If the table has changes or errors, create a subset DataSet.
if (dataSet.HasChanges(DataRowState.Modified |
DataRowState.Added)& dataSet.HasErrors)
{
// Use GetChanges to extract subset.
changeDataSet = dataSet.GetChanges(
DataRowState.Modified|DataRowState.Added);
PrintValues(changeDataSet, "Subset values" );
// Insert code to reconcile errors. In this case reject changes.
foreach (DataTable changeTable in changeDataSet.Tables)
{
if (changeTable.HasErrors)
{
foreach (DataRow changeRow in changeTable.Rows)
{
//Console.WriteLine(changeRow["Item"]);
if ((int )changeRow["Item" ,
DataRowVersion.Current ]> 100)
{
changeRow.RejectChanges();
changeRow.ClearErrors();
}
}
}
}
PrintValues(changeDataSet, "Reconciled subset values" );
// Merge changes back to first DataSet.
dataSet.Merge(changeDataSet);
PrintValues(dataSet, "Merged Values" );
}
}

private void PrintValues(DataSet dataSet, string label)
{
Console.WriteLine("/n" + label);
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine("TableName: " + table.TableName);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
Console.Write("/table " + row[column] );
}
Console.WriteLine();
}
}
}



Hugging Face 的 `datasets` 库是一个非常强大的工具,用于处理各种机器学习任务的数据集管理。当你需要将两个或更多的 `Dataset` 对象合并在一起时,可以使用库提供的几种方法。 ### 合并 Dataset #### 1. 使用 `concatenate_datasets` 这是最直接的方式之一,适合于当你要简单地连接几个同结构的数据集的时候: ```python from datasets import load_dataset, concatenate_datasets # 加载一些示例数据集 dataset1 = load_dataset('glue', 'mrpc') dataset2 = load_dataset('glue', 'qqp') # 确保我们只取训练部分作为例子,并且它们有相同的特征 train_ds1 = dataset1['train'].select([i for i in range(0, min(len(dataset1['train']), 5))]) train_ds2 = dataset2['train'].select([i for i in range(0, min(len(dataset2['train']), 5))]) # 进行合并操作 merged_dataset = concatenate_datasets([train_ds1, train_ds2]) print("Merged dataset first row:", merged_dataset[0]) ``` 注意这里假设所有参与拼接的数据集有着一致的字段名和大致相似的内容形式;如果遇到异构情况,则需先做预处理使其统一化后再考虑合并。 #### 2. 自定义函数实现更复杂的合并逻辑 对于那些拥有不同属性或是完全不一样格式的数据集合来说,可能就需要编写自定义代码来进行转换、映射等操作了。 例如通过添加额外列标记每条记录来自哪一个原始数据源,在某些应用场景下这可能是必要的步骤以便后续分析能够追溯到具体来源信息: ```python def merge_with_source_label(dss): def add_src_field(examples, src_name): return {**examples, "source": [src_name] * len(examples["id"])} processed_dss = [] for idx, ds in enumerate(dss): new_ds = ds.map(lambda x: add_src_field(x, f"ds_{idx}"), batched=True) processed_dss.append(new_ds) return concatenate_datasets(processed_dss) custom_merged_dataset = merge_with_source_label([train_ds1, train_ds2]) print(custom_merged_dataset.features) # 查看包含新加入'source'字段后的特性列表 ``` 这种做法使得每个样本都会带上它原本属于哪个数据集的信息,有助于保持追踪性和灵活性。 --
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值