Как получить идентификатор последней созданной записи из базы данных Sql с помощью Asp.Net

Объясню проблему на примере:

В моей базе данных есть две таблицы: именованная запись, теги

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 682
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы, вероятно, сделал это с помощью триггера INSERT для именованной таблицы записей, если у вас есть все данные, которые нужно передать в таблицу тегов. Если нет, то вы можете рассмотреть возможность использования хранимой процедуры, которая создает и то, и другое внутри транзакции.

Если вы хотите сделать это в коде, вам нужно будет более точно указать, как вы управляете своими данными. Вы используете DataAdapter, DataTables, LINQ, NHibernate, ...? По сути, вам нужно обернуть обе вставки внутри какой-либо транзакции, чтобы либо вставки выполнялись, либо ни одна из них не выполнялась, но средства для этого зависят от того, какую технологию вы используете для взаимодействия с базой данных.

Спасибо за сделку, но я никогда не использовал хранимые процедуры или триггеры. Я использую динамический sql в своих проектах, и если есть способ сделать это с динамическим sql, будет лучше.

mavera 24.11.2008 21:48

Единственный способ сделать это - использовать несколько операторов. Используя динамический sql, вы можете сделать это, разделив каждый оператор в строке запроса точкой с запятой:

"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"

Убедитесь, что вы поместили это в транзакцию, чтобы защитить от проблем параллелизма и сохранить все атомарность. Вы также можете разбить это на два отдельных запроса, чтобы вернуть новое значение ID посередине, если хотите; просто убедитесь, что оба запроса находятся в одной транзакции.

Также: вы используете параметризованные запросы со своим динамическим sql, верно? Если нет, я лично подойду к вам и 10 000 раз ударю вас влажной лапшой, пока вы не покаетесь в своих неуверенных поступках.

Вы захотите обернуть их внутри транзакции на случай, если вторая вставка не удастся.

tvanfosson 24.11.2008 22:02
Ответ принят как подходящий

Сразу после выполнения оператора вставки для первой таблицы вы должны запросить @@ IDENTITY, выполнив «SELECT @@ identity». Это извлечет последний автоматически сгенерированный идентификатор ... а затем просто вставит его во вторую таблицу.

Если вы используете триггеры или что-то, что вставляет строки ... это может не сработать. Используйте Scope_Identity () вместо @@ IDENTITY

scope_identity () обычно предпочтительнее, чем @@ identity и вне триггеров: уверены ли вы, что триггер не будет добавлен позже, незаметно "нарушая" код?

Joel Coehoorn 24.11.2008 22:10

SCOPE_IDENTITY () просто думаю, что я хочу

mavera 24.11.2008 22:17

Если вы используете динамический sql, почему бы не использовать Linq to Entity Framework, теперь EF является рекомендуемой технологией доступа к данным от Microsoft (см. Этот пост Уточнение сообщения о L2S Futures из блога группы ADO.NET), и если вы сделаете вставку с EF, последний идентификатор идентификатора будет доступен для вас автоматически, я использую его постоянно, это просто.

Надеюсь это поможет!

Рэй.

Другие вопросы по теме