cmd.CommandText = "select top 5 * from sysuser";DataTable dt1 = new DataTable();
dt1.PrimaryKey = new DataColumn[] { dt1.Columns["sysuserid"] };
ada.Fill(dt1);
dt1.AcceptChanges();cmd.CommandText = "select top 15 * from sysuser";
DataTable dt2 = new DataTable();
ada.Fill(dt2);
dt2.PrimaryKey = new DataColumn[] { dt2.Columns["sysuserid"] };
dt2.AcceptChanges();dt1.Merge(dt2);DataTable dt3 = dt1.GetChanges();
为什么dt3为null?不是往dt1中添加了新数据了吗?我在执行MSDN上的样例时是有效的,但为什么我从数据库中获取就无效?我想通过该方法比较两个DataTable(一新一旧)的结构及其数据的不同处,然后在DataView中标记出来。

解决方案 »

  1.   

    Merge 方法用于合并架构大致相似的两个 DataTable 对象。合并在客户端应用程序上通常用于将数据源中最近的更改合并到现有的 DataTable 中。这使客户端应用程序能够拥有用数据源中的最新数据刷新的 DataTable。 合并操作仅对原始表和要合并的表进行操作。子表不会受到影响或被包括在内。如果某个表具有一个或多个作为关系的一部分定义的子表,则需要分别合并每个子表。 
    http://msdn.microsoft.com/zh-cn/vsts2008/system.data.datatable.merge.aspx
      

  2.   

    那页MSDN我看了很久了,在DataTable.Merge的页面中有这段代码:private static void DemonstrateMergeTable()
    {
        DataTable table1 = new DataTable("Items");    // Add columns
        DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
        DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
        table1.Columns.Add(idColumn);
        table1.Columns.Add(itemColumn);    // Set the primary key column.
        table1.PrimaryKey = new DataColumn[] { idColumn };    // Add RowChanged event handler for the table.
        table1.RowChanged += new 
            System.Data.DataRowChangeEventHandler(Row_Changed);    // Add ten rows.
        DataRow row;
        for (int i = 0; i <= 9; i++)
        {
            row = table1.NewRow();
            row["id"] = i;
            row["item"] = i;
            table1.Rows.Add(row);
        }    // Accept changes.
        table1.AcceptChanges();
        PrintValues(table1, "Original values");    // Create a second DataTable identical to the first.
        DataTable table2 = table1.Clone();    // Add column to the second column, so that the 
        // schemas no longer match.
        table2.Columns.Add("newColumn", typeof(System.String));    // Add three rows. Note that the id column can't be the 
        // same as existing rows in the original table.
        row = table2.NewRow();
        row["id"] = 14;
        row["item"] = 774;
        row["newColumn"] = "new column 1";
        table2.Rows.Add(row);    row = table2.NewRow();
        row["id"] = 12;
        row["item"] = 555;
        row["newColumn"] = "new column 2";
        table2.Rows.Add(row);    row = table2.NewRow();
        row["id"] = 13;
        row["item"] = 665;
        row["newColumn"] = "new column 3";
        table2.Rows.Add(row);    // Merge table2 into the table1.
        Console.WriteLine("Merging");
        table1.Merge(table2, false, MissingSchemaAction.Add);
        PrintValues(table1, "Merged With table1, schema added");}private static void Row_Changed(object sender, 
        DataRowChangeEventArgs e)
    {
        Console.WriteLine("Row changed {0}\t{1}", e.Action, 
            e.Row.ItemArray[0]);
    }private static void PrintValues(DataTable table, string label)
    {
        // Display the values in the supplied DataTable:
        Console.WriteLine(label);
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn col in table.Columns)
            {
                Console.Write("\t " + row[col].ToString());
            }
            Console.WriteLine();
        }
    }
    是可以取出新加入的数据的,我的只是和它的数据来源不一样,为什么就不可以了呢?
      

  3.   

    Merge方法是将两个结构相似的datatable合并成一个datatable: 
    DataTable dt1 = new DataTable();
    dt1.Columns.Add("id");
    dt1.Columns.Add("name");
    dt1.Columns.Add("pwd");
    for (int i = 0; i < 5; i++)
    {
    dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" });
    }
     DataTable dt2 = new DataTable();
    dt2.Columns.Add("id");
    dt2.Columns.Add("name");
    dt2.Columns.Add("pwd");
    for (int i = 5; i < 10; i++)
    {
    dt1.Rows.Add(new object[] { i.ToString(), "name" + i.ToString(), "" });
    }
    DataTable dt3 = null;
    dt3 = dt1.Clone();
    if (dt3 != null)
    {
    dt3.Merge(dt1);
    dt3.Merge(dt2);
    }
      

  4.   

    cmd.CommandText = "select top 5 * from sysuser";DataTable dt1 = new DataTable();
    dt1.PrimaryKey = new DataColumn[] { dt1.Columns["sysuserid"] };
    ada.Fill(dt1);
    dt1.AcceptChanges();cmd.CommandText = "select top 15 * from sysuser";
    DataTable dt2 = new DataTable();
    ada.Fill(dt2);
    dt2.PrimaryKey = new DataColumn[] { dt2.Columns["sysuserid"] };
    dt2.AcceptChanges();--这个时候你将dt2的表结束编辑了。所有dt2的数据(row)都是unchange状态
    dt1.Merge(dt2);
    --再merge进来还是unchange啊。merge的时候是会将状态也保持的
    DataTable dt3 = dt1.GetChanges();