如何在没有副本的情况下合并DataTable?

时间:2010-01-13 14:16:03

标签: c# datagridview datatable dataset

我有两个从同一个SQL代码生成的数据库和两个从这个数据库创建的数据集。我想从这两个数据集创建一个数据集,我想我可以这样做:

public void MergeGatunek()
{
    DB1.DataSetGatunek.Tables[0].Merge(DB2.DataSetGatunek.Tables[0], true);
    DataSetGatunek.Tables[0].Merge(DB1.DataSetGatunek.Tables[0], true);
    //DataSetGatunek is the final DataSet
}

这就是结果:

应用程序是波兰语,但它不应该是一个问题。

每个下一个新行只会将之前添加的结果相乘。我的目标是在一个DataGridView中显示来自两个数据库的数据,并添加缺失的行(如果有的话)。

我正在使用此方法填充数据集,添加新行等。

public void SelectGatunek(string SQL)
{
    try
    {
        Connection.Open();
        DataAdapter = new SqlDataAdapter(SQL, Connection);
        commandBuilder = new SqlCommandBuilder(DataAdapter);
        DataSetGatunek.Clear();
        DataAdapter.Fill(DataSetGatunek);

        Connection.Close();
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
}

SelectGatunek("Select * FROM t_gatunek");

SelectGatunek("INSERT INTO t_gatunek (gatunek) VALUES ('" + DG.GetGatunek + "')");

3 个答案:

答案 0 :(得分:1)

为避免重复'id_gatunek'字段,请在数据库中创建列作为标识字段。

http://support.microsoft.com/kb/313540

  • 手动检查并更新每一行,而不是在DataSet上使用AcceptChanges方法。
  • 使用DataAdapter对象的RowUpdated事件并跳过重复的行。

If e.StatementType = StatementType.Insert Then e.Status = UpdateStatus.SkipCurrentRow

答案 1 :(得分:0)

我认为这是因为您需要指定DataTable.PrimaryKey,以便它们正确合并。

如果该字段是数据库中的主键,则应该为您完成。

答案 2 :(得分:0)

使用TGadfly的解决方案我得到了这个工作:

public void FillGatunek()
{
    try
    {
        Connection.Open();
        GatunekDataAdapter = new SqlDataAdapter("SELECT * FROM t_gatunek", Connection);
        commandBuilder = new SqlCommandBuilder(GatunekDataAdapter);
        GatunekDataAdapter.FillSchema(DataSetGatunek, SchemaType.Mapped, "t_gatunek");
        DataSetGatunek.Tables["t_gatunek"].Columns["id_gatunek"].AutoIncrement = true;
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
    finally
    {
        Connection.Close();
    }
}

public void InsertGatunek(string Gatunek)
{
    try
    {
        Connection.Open();
        DataRow R = DataSetGatunek.Tables["t_gatunek"].NewRow();
        R["gatunek"] = Gatunek;
        DataSetGatunek.Tables["t_gatunek"].Rows.Add(R);
        DataSetGatunek.GetChanges();
        GatunekDataAdapter.Update(DataSetGatunek, "t_gatunek");
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
    finally
    {
        Connection.Close();
    }
}