Как объединить DataTable без копий? - PullRequest
0 голосов
/ 13 января 2010

У меня есть две базы данных, сгенерированные из одного и того же кода 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 ]

1 голос
/ 13 января 2010

Чтобы избежать дублирования поля 'id_gatunek', создайте столбец в базе данных как поле идентификатора.

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

  • Проверять и обновлять каждую строку вручную вместо использования метода AcceptChanges в DataSet.
  • Используйте событие RowUpdated объекта DataAdapter и пропустите повторяющиеся строки.

<code>If e.StatementType = StatementType.Insert Then e.Status = UpdateStatus.SkipCurrentRow
0 голосов
/ 13 января 2010

Используя решение 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();
    }
}
0 голосов
/ 13 января 2010

Я думаю, это потому, что вам нужно указать DataTable.PrimaryKey, чтобы они сливались правильно.

Это должно быть сделано для вас, если поле является первичным ключом в вашей БД.

...