C# 如何合并没有副本的数据表?

C# 如何合并没有副本的数据表?,c#,datagridview,datatable,dataset,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); //DataS

我有两个由相同的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 + "')");

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


如果该字段是数据库中的主键,则应执行此操作。

为避免重复“id\u gatunek”字段,请在数据库中创建列作为标识字段

  • 手动检查并更新每一行,而不是在数据集上使用AcceptChanges方法
  • 使用DataAdapter对象的RowUpdate事件并跳过重复的行
如果e.StatementType=StatementType.Insert,则e.Status=UpdateStatus.SkipCurrentRow

使用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();
    }
}

“id_gatunek”被设置为主键,我认为它是一个身份字段。这是一个截图,我很高兴我能提供帮助
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();
    }
}