вставьте 2 основные записи в одном выпуске - PullRequest
0 голосов
/ 19 мая 2019

Я использую 2 связанные таблицы для одновременной вставки основных записей в приложении Windows Form, эти таблицы называются, например, "Orders" и "Order Details".

  • Сначала я создаюнабор данных с именем "dataSet1" и создайте адаптер таблицы строк для этих 2 таблиц
  • Затем я открываю свои формы в режиме конструктора и сначала перетаскиваю из окна источника данных таблицу "Orders", затем я отбрасываю соответствующую "Order Details "таблица, создающая основной подробный интерфейс,
  • , поэтому основной записью является запись" Orders ", которая отображается как поля в форме, а подробная запись" Order Details "отображается как datadridview fields и
  • сохранить логический код в кнопке "ordersBindingNavigatorSaveItem" в bindingnavigator, который автоматически создается, как:

        this.Validate();
        this.ordersBindingSource.EndEdit();
        this.tableAdapterManager.UpdateAll(this.dataSet1);
    
  • затем, когда я вставляю "Order "записать и прежде чем сохранить его в базе данных, я создаю хотя бы одну дочернюю запись" Order Details ", затем я вызываю код сохранения, показанный выше, чтобы сохранить все в то же время, когда я получаю сообщение об ошибке, например:

Оператор INSERT конфликтует с FOREIGN KEY ограничение "FK_Order_Details_Orders".Конфликт произошел в базе данных "Northwind", таблице "dbo.Orders", столбце "OrderID".Оператор был прерван.

  • , но когда я вставляю запись "Order" и сохраняю ее в базу данных, тогда я вставляю запись "Order Details" и сохраняю ее, все в порядке

мой вопрос: как я могу вставить основную и дочернюю записи одновременно?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Короче говоря, ваш код нарушает ссылочную целостность.

Основываясь на ваших примерах кода, я вижу, что вы используете какую-то инфраструктуру для вставки записей в БД. Фреймворки, которые я использовал некоторое время назад, тоже не понравились, поскольку они ожидают, что вы сначала добавите основную запись, а затем добавите подробные записи.

Прежде чем идти дальше, спросите себя, почему вы добавляете и мастер, и детали одновременно, и если есть способ разделить это на 2 логические операции? Если нет, вы всегда можете написать хранимую процедуру и вызвать ее из своего кода:

CREATE PROCEDURE sp_<proc_name>
...
BEGIN TRAN
INSERT INTO <master>...
INSERT INTO <detail>...
COMMIT TRAN
0 голосов
/ 19 мая 2019

Вы должны использовать хранимую процедуру, чтобы вставить в обе таблицы одновременно

...