У меня есть приложение winforms с двумя DataGridViews, отображающими отношения мастер-детали из моих таблиц Person и Address. Таблица Person имеет поле PersonID, которое является автоматически увеличивающим первичный ключ. Адрес имеет поле PersonID, которое является FK.DataRelation Insert и ForeignKey
Я заполняю DataTables DataAdapter и устанавливаю AutoIncrement столбца Person.PersonID = true и AutoIncrementStep = -1. Я могу вставлять записи в DataTable Person из DataGridView. В столбце PersonID отображаются уникальные отрицательные значения для PersonID. Я обновляю базу данных, вызывая DataAdapter.Update (PersonTable), а отрицательные персональные идентификаторы автоматически преобразуются в положительные уникальные значения SQL Server.
Вот протирать. Адрес DataGridView показывает таблицу адресов, которая имеет DataRelation для Person по PersonID. Записи «Вставленные лица» имеют временный отрицательный идентификатор PersonID. Теперь я могу вставлять записи в адрес через DataGridView и Address.PersonID устанавливается отрицательное значение из сопоставления DataRelation. Я вызываю Adapter.Update (AddressTable), а отрицательные персонажи попадают в таблицу Address, нарушая связь.
Как вы, ребята, обрабатываете первичные/внешние ключи с помощью DataTables и master-detail DataGridViews?
Спасибо! Стив
EDIT:
После еще Googling, я обнаружил, что SqlDataAdapter.RowUpdated событие дает мне то, что мне нужно. Я создаю новую команду для запроса последнего вставленного идентификатора с помощью @@ IDENTITY. Это работает очень хорошо. DataRelation обновляет поле Address.PersonID для меня, поэтому сначала необходимо обновить таблицу Person, а затем обновить таблицу Address. Все новые записи правильно вставляются с правильными идентификаторами на месте!
Adapter = new SqlDataAdapter(cmd);
Adapter.RowUpdated += (s, e) =>
{
if (e.StatementType != StatementType.Insert) return;
//set the id for the inserted record
SqlCommand c = e.Command.Connection.CreateCommand();
c.CommandText = "select @@IDENTITY id";
e.Row[0] = Convert.ToInt32(c.ExecuteScalar());
};
Adapter.Fill(this);
SqlCommandBuilder sb = new SqlCommandBuilder(Adapter);
sb.GetDeleteCommand();
sb.GetUpdateCommand();
sb.GetInsertCommand();
this.Columns[0].AutoIncrement = true;
this.Columns[0].AutoIncrementSeed = -1;
this.Columns[0].AutoIncrementStep = -1;