Как получить идентификатор последней созданной записи из базы данных SQL с Asp.Net - PullRequest
2 голосов
/ 24 ноября 2008

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

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

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

Ответы [ 4 ]

4 голосов
/ 24 ноября 2008

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

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

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

Также: вы используете параметризованные запросы с вашим динамическим SQL, верно? Если это не так, я лично приду к вам и сотрясу вас 10000 раз мокрой лапшой, пока вы не покаетесь в своих небезопасных путях.

0 голосов
/ 24 ноября 2008

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

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

Ray.

0 голосов
/ 24 ноября 2008

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

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

0 голосов
/ 24 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...