Перед тем как решиться написать вопрос облазил весь RSDN в поиске по ключевым словам DataSet и Merge. Ответа не нашел.
Лучшее описание вопроса — это исходник

Суть проблемы такова — у меня есть датасет myDataSet(упрощенный вариант состоит из одной таблицы), я в него из БД считываю данные. Затем добавляю непосредственно в таблицу DataSet-a одну строку, делаю GetChanges() для него, и полученый датасет с изменениями nChangesSet синхронизирую с базой данных — dataadapter.update(nChangesSet). После этого Соединяю эти 2 датасета в надежде,что информация в исходном myDataSet обновится с помощью nChangesSet(В частности поле ключа)
А получаю следующий результат — вместо одной записи с нормальным ключом(таким же как и запись в БД), myDataSet содержит 2 записи, одну со значением ключевого поля датасета(предположим 0), а вторая запись уже содержит нормальное значение ключа(предположим 678).
Что это за херня такая и как с ней бороться???
public void TestFunc()
{
#region createDataSet
DataSet myDataSet = new DataSet("MyDataSet");
DataTable myLineTable = new DataTable("Line");
DataColumn idColumn = new DataColumn("Line_ID", typeof(int));
idColumn.AutoIncrement=true;
DataColumn FPXColumn = new DataColumn("First_Point_X", typeof(int));
DataColumn FPYColumn = new DataColumn("First_Point_Y", typeof(int));
DataColumn SPXColumn = new DataColumn("Second_Point_X", typeof(int));
DataColumn SPYColumn = new DataColumn("Second_Point_Y", typeof(int));
DataColumn WidthColumn = new DataColumn("Width", typeof(System.Double));
DataColumn ColorColumn = new DataColumn("Color", typeof(int), null);
// DataColumn array to set primary key.
DataColumn[] keyColumn= new DataColumn[1];
// Add columns to table, and table to DataSet.
myLineTable.Columns.Add(idColumn);
myLineTable.Columns.Add(FPXColumn);
myLineTable.Columns.Add(FPYColumn);
myLineTable.Columns.Add(SPXColumn);
myLineTable.Columns.Add(SPYColumn);
myLineTable.Columns.Add(WidthColumn);
myLineTable.Columns.Add(ColorColumn);
myDataSet.Tables.Add(myLineTable);
// Set primary key column.
keyColumn[0]= idColumn;
myLineTable.PrimaryKey=keyColumn;
#endregion
//Эту строчку измените для подключения к своему SQL server
SqlConnection nConn = new SqlConnection("workstation id=DUMA;Integrated Security=SSPI;Initial Catalog=Shapes");
nConn.Open();
#region init m_lineDataAdapter
SqlDataAdapter m_lineDataAdapter = new SqlDataAdapter();
m_lineDataAdapter.TableMappings.Add("Table", "Line");
//Процедура заполнения таблицы(обычный SELECT, который выбирает все значения)
SqlCommand cmd = new SqlCommand("GetLines", nConn);
cmd.CommandType = CommandType.StoredProcedure;
m_lineDataAdapter.SelectCommand = cmd;
//Процедура вставки записи(тыходному параметру присваивается в процедуре @@IDENTITY и отобразается на поле ключа)
cmd = new SqlCommand("AddLine", nConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@first_x", SqlDbType.Int, 0, "First_Point_X"));
cmd.Parameters.Add(new SqlParameter("@first_y", SqlDbType.Int, 0, "First_Point_Y"));
cmd.Parameters.Add(new SqlParameter("@second_x", SqlDbType.Int, 0, "Second_Point_X"));
cmd.Parameters.Add(new SqlParameter("@second_y", SqlDbType.Int, 0, "Second_Point_Y"));
cmd.Parameters.Add(new SqlParameter("@width_l", SqlDbType.Float, 0, "Width"));
cmd.Parameters.Add(new SqlParameter("@color_l", SqlDbType.Int, 0, "Color"));
cmd.Parameters.Add(new SqlParameter("@line_id", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, "Line_ID", DataRowVersion.Default, null));
cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;
m_lineDataAdapter.InsertCommand = cmd;
//И Ежу понятно — удаление (не используется)
cmd = new SqlCommand("DeleteLine", nConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int, 0, "Line_ID"));
m_lineDataAdapter.DeleteCommand = cmd;
//Обновление(опять-таки в данном примере не используется)
cmd = new SqlCommand("UpdateLine", nConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int, 0, "Line_ID"));
cmd.Parameters.Add(new SqlParameter("@first_x", SqlDbType.Int, 0, "First_Point_X"));
cmd.Parameters.Add(new SqlParameter("@first_y", SqlDbType.Int, 0, "First_Point_Y"));
cmd.Parameters.Add(new SqlParameter("@second_x", SqlDbType.Int, 0, "Second_Point_X"));
cmd.Parameters.Add(new SqlParameter("@second_y", SqlDbType.Int, 0, "Second_Point_Y"));
cmd.Parameters.Add(new SqlParameter("@width_l", SqlDbType.Float, 0, "Width"));
cmd.Parameters.Add(new SqlParameter("@color_l", SqlDbType.Int, 0, "Color"));
cmd.UpdatedRowSource = UpdateRowSource.None;
m_lineDataAdapter.UpdateCommand = cmd;
#endregion
//Ради интереса заполняем(но для наглядности можно коментить, пусть датасет будет девственно чист

m_lineDataAdapter.Fill(myDataSet, "Line");
//Add new row
DataRow newRow = myLineTable.NewRow();
newRow["First_Point_X"] = 10;
newRow["First_Point_Y"] = 10;
newRow["Second_Point_X"] = 100;
newRow["Second_Point_Y"] = 100;
newRow["Width"] = 10;
newRow["Color"] = System.Drawing.Color.Black.ToArgb();
myLineTable.Rows.Add(newRow);
//Вот оно — получение изменений
DataSet nChangesSet = myDataSet.GetChanges();
//Все по прежнему хорошо, получаем обновление ключевого поля
m_lineDataAdapter.Update(nChangesSet, "Line");
//А вот тут трындец какой-то мне непонятный(myDataSet содержит 2 строки — новую и старую)
myDataSet.Merge(nChangesSet, true); //myDataSet.Merge(nChangesSet, true); или myDataSet.Merge(nChangesSet); не предлагать, имхо не помогает
myDataSet.AcceptChanges();
nConn.Close();
}
I need help!!! В чем ошибка???