none
Как вставить новые master-detail строки, когда столбец первичного ключа авто-инкрементируемый RRS feed

  • Общие обсуждения

  • Объект DataSet позволяет это сделать, просто это не так очевидно.

    Во первых, для автоматически инкрементируемых столбцов в DataSet нужно установить свойства AutoIncrementSeed и AutoIncrementStep в -1 (отрицательная единица). Это позволит ясно определить, какие IDs являются временными, а какие на самом деле есть в базе данных.

    Во вторых, убедитесь, что у Вас определено отношение DataRelation с ограничением ForeignKeyConstraint между родительской и дочерней таблицами. Установите UpdateRule объекта ForeignKeyConstraint в Rule.Cascade. Это чрезвычайно важно, при первом обновлении родительской таблицы, посредством вызова метода Update(), из базы данных будут получены Ids для родительской таблицы, которые автоматически каскадно распространятся в дочернюю таблицу в DataSet.

    Для того чтобы это работало правильно, процедура INSERT должна на самом деле выполнить SELECT, которая вернет ID вставленной записи. Другими словами, она должна быть написана, как инструкции или хранимые процедуры, которые генерирует мастер TableAdapter. Например, INSERT должен содержать операторы INSERT и SELECT, разделенные точкой с запятой. Ниже пример, сгенерированный мастером SQL для INSERT:

    INSERT INTO [dbo].[Test] ([MyCol1], [MyCol2]) VALUES (@MyCol1, @MyCol2);
    SELECT TestID, MyCol1, MyCol2 FROM Test WHERE (TestID = SCOPE_IDENTITY())
    

     

    3 ноября 2010 г. 13:02