导航
  • 主页
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

如何合并两个dataset中的内容,dataset结构一样

jourmen IBM 架构师  2004-07-28 02:44:26
如何合并两个dataset中的内容,dataset结构一样

ds1有一条记录,ds2也有一条记录,记录结构一样,我想把两条记录合并到一个dataset里,然后在一个datagrid里显示出来

怎么做呢?
谢谢
...全文
226 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
WZCNet 2004-08-06
ds1.Merge(ds2);
最简单了.
回复
dxphero 2004-08-06
你可以是一下:假如有两个库 k1 , k2。k1中的字段a,b; k2中的字段b,c;
首先,string str="select k1.a,k1.b,k2.c from k1,k2 where k1.b=k2.b k1.b=values";
OracleDataAdapter da=new OracleDataAdapter(str,con);
DataSet ds= new DataSet();
da.Fill(ds,"tabel");
这样就把他们填到一张表中了。
回复
dxphero 2004-08-06
你是不是通过两个datagrid来画一张表从表面上来说是从一张表里出来的但是实际上是从两张表合并出来的,对不对?
回复
jourmen 2004-07-28
up

麻烦大家帮我想想

我原来是动态的在程序里画table来做的,但是界面显示不好看

所以想用一个datagrid来显示
回复
precipitant 2004-07-28
合并我不太会,保存是否可以用session
回复
jourmen 2004-07-28
或许是我没表达清楚,我要现实的功能是这样的,
查询条件1---->ds1,查询条件2---->ds2,我想把ds2的内容合并到ds1里,这样就可以在一个datagrid里显示出来,这样的话,ds1在程序运行期间如何一直保存着呢?

这样以后在有条件3--->ds3,我在添加到ds1里, 依此类推,我就可以一直用一个datagrid来显示数据

怎么做呢?

谢谢大家!
回复
jourmen 2004-07-28
或许是我没表达清楚,我要现实的功能是这样的,
查询条件1---->ds1,查询条件2---->ds2,我想把ds2的内容合并到ds1里,这样就可以在一个datagrid里显示出来,这样的话,ds1在程序运行期间如何一直保存着呢?
回复
CMIC 2004-07-28
对ds1里是两个记录了
回复
jonescheng 2004-07-28
晕阿。五星的速度就是快阿
补充一下。。。
将指定的 DataSet 及其架构合并到当前 DataSet 中,在此过程中,将根据给定的参数保留或放弃在此 DataSet 中进行的任何更改。
[C#]
public void Merge(
DataSet dataSet,
bool preserveChanges
);
参数
dataSet
数据和架构将被合并的 DataSet。
preserveChanges
要保留当前 DataSet 中的更改,则为 true;否则为 false。
备注
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 值为 Unchanged、Modified 或 Deleted 的任何源行都会与具有同一主键值的目标行相匹配。DataRowState 值为 Added 的源行将匹配主键值与新源行相同的新目标行。合并过程中将禁用约束。如果在合并结束时无法启用任何约束,则会在禁用约束的同时生成 ConstraintException 并保留合并的数据。这种情况下,EnforceConstraints 属性将设置为 false,并且所有无效行都会标记为出错。在试图将 EnforceConstraints 属性重置为 true 之前,必须消除这些错误。
示例
[Visual Basic, C#] 以下示例创建一个简单的 DataSet,该数据集包含一个表、两个列和十个行。在添加十个行之后,更改了两个值并添加了一个行。使用 GetChanges 方法创建已更改数据的子集。在调节错误之后,子集中的数据合并到原始的 DataSet 中。
[[C#]
private void DemonstrateMerge(){
// Create a DataSet with one table, two columns, and three rows.
DataSet ds = new DataSet("myDataSet");
DataTable t = new DataTable("Items");
DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"),"");
c1.AutoIncrement=true;
DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"),"");
// DataColumn array to set primary key.
DataColumn[] keyCol= new DataColumn[1];
DataRow r;
// Create variable for temporary DataSet.
DataSet xSet;
// Add RowChanged event handler for the table.
t.RowChanged+=new DataRowChangeEventHandler(Row_Changed);
ds.Tables.Add(t);
t.Columns.Add(c1);
t.Columns.Add(c2);
// Set primary key column.
keyCol[0]= c1;
t.PrimaryKey=keyCol;
// Add ten rows.
for(int i = 0; i <10;i++){
r=t.NewRow();
r["Item"]= i;
t.Rows.Add(r);
}
// Accept changes.
ds.AcceptChanges();
PrintValues(ds, "Original values");
// Change row values.
t.Rows[0]["Item"]= 50;
t.Rows[1]["Item"]= 111;
// Add one row.
r=t.NewRow();
r["Item"]=74;
t.Rows.Add(r);
// Insert code for error checking. Here we set one row in error.
t.Rows[1].RowError= "over 100";
PrintValues(ds, "Modified and New Values");
// If the table has changes or errors, create a subset DataSet.
if(ds.HasChanges(DataRowState.Modified | DataRowState.Added)& ds.HasErrors){
// Use GetChanges to extract subset.
xSet = ds.GetChanges(DataRowState.Modified|DataRowState.Added);
PrintValues(xSet, "Subset values");
// Insert code to reconcile errors. In this case, we'll reject changes.
foreach(DataTable xTable in xSet.Tables){
if (xTable.HasErrors){
foreach(DataRow xRow in xTable.Rows){
//Console.WriteLine(xRow["Item"]);
if((int)xRow["Item",DataRowVersion.Current ]> 100){
xRow.RejectChanges();
xRow.ClearErrors();
}
}
}
}
// Add a column to the xSet.
xSet.Tables["Items"].Columns.Add(new DataColumn("newColumn"));
PrintValues(xSet, "Reconciled subset values");
// Merge changes back to first DataSet.
ds.Merge(xSet,false,System.Data.MissingSchemaAction.Add);
}
PrintValues(ds, "Merged Values");
}

private void Row_Changed(object sender, DataRowChangeEventArgs e){
Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]);
}

private void PrintValues(DataSet ds, string label){
Console.WriteLine(label + "\n");
foreach(DataTable t in ds.Tables){
Console.WriteLine("TableName: " + t.TableName);
foreach(DataRow r in t.Rows){
foreach(DataColumn c in t.Columns){
Console.Write("\t " + r[c] );
}
Console.WriteLine();
}
}
}
回复
yikais 2004-07-28
ds1.Merge(ds2);
回复
jourmen 2004-07-28
这样做的话,ds1里是不是有两个记录了?

我需要这样的效果?
回复
acewang 2004-07-28
ds1.Merge(ds2);
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告