Объясню проблему на примере:
В моей базе данных есть две таблицы: именованная запись, теги
В обеих таблицах есть столбец с именем ID_ENTRY. Когда я добавляю запись в таблицу, запись, я должен взять ID_ENTRY последней добавленной записи и добавить ее в таблицу, теги. Как мне это сделать?





Я бы, вероятно, сделал это с помощью триггера INSERT для именованной таблицы записей, если у вас есть все данные, которые нужно передать в таблицу тегов. Если нет, то вы можете рассмотреть возможность использования хранимой процедуры, которая создает и то, и другое внутри транзакции.
Если вы хотите сделать это в коде, вам нужно будет более точно указать, как вы управляете своими данными. Вы используете DataAdapter, DataTables, LINQ, NHibernate, ...? По сути, вам нужно обернуть обе вставки внутри какой-либо транзакции, чтобы либо вставки выполнялись, либо ни одна из них не выполнялась, но средства для этого зависят от того, какую технологию вы используете для взаимодействия с базой данных.
Единственный способ сделать это - использовать несколько операторов. Используя динамический sql, вы можете сделать это, разделив каждый оператор в строке запроса точкой с запятой:
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
Убедитесь, что вы поместили это в транзакцию, чтобы защитить от проблем параллелизма и сохранить все атомарность. Вы также можете разбить это на два отдельных запроса, чтобы вернуть новое значение ID посередине, если хотите; просто убедитесь, что оба запроса находятся в одной транзакции.
Также: вы используете параметризованные запросы со своим динамическим sql, верно? Если нет, я лично подойду к вам и 10 000 раз ударю вас влажной лапшой, пока вы не покаетесь в своих неуверенных поступках.
Вы захотите обернуть их внутри транзакции на случай, если вторая вставка не удастся.
Сразу после выполнения оператора вставки для первой таблицы вы должны запросить @@ IDENTITY, выполнив «SELECT @@ identity». Это извлечет последний автоматически сгенерированный идентификатор ... а затем просто вставит его во вторую таблицу.
Если вы используете триггеры или что-то, что вставляет строки ... это может не сработать. Используйте Scope_Identity () вместо @@ IDENTITY
scope_identity () обычно предпочтительнее, чем @@ identity и вне триггеров: уверены ли вы, что триггер не будет добавлен позже, незаметно "нарушая" код?
SCOPE_IDENTITY () просто думаю, что я хочу
Если вы используете динамический sql, почему бы не использовать Linq to Entity Framework, теперь EF является рекомендуемой технологией доступа к данным от Microsoft (см. Этот пост Уточнение сообщения о L2S Futures из блога группы ADO.NET), и если вы сделаете вставку с EF, последний идентификатор идентификатора будет доступен для вас автоматически, я использую его постоянно, это просто.
Надеюсь это поможет!
Рэй.
Спасибо за сделку, но я никогда не использовал хранимые процедуры или триггеры. Я использую динамический sql в своих проектах, и если есть способ сделать это с динамическим sql, будет лучше.