После создания новой строки в базе данных я должен вернуть первичный ключ в строку или объект передачи данных?

У меня есть трехуровневая система, база данных SQL Server, уровень доступа к файлам вручную и использование хранимых процедур.

У меня есть таблица EventTable. Каждая строка представляет собой «Событие». Событие имеет первичный ключ и дату начала.

CREATE TABLE EventTable ( ID INT IDENTITY(100,1) PRIMARY KEY, StartTime DateTime NOT NULL ) 

Существует хранимая процедура EventTable_Create. Кстати, метод создания в порядке, как написано?

 CREATE PROCEDURE Event_Create @NewID INT OUT AS DECLARE @START DATETIME SELECT @START = getdate() INSERT INTO EventTable VALUES(@START, NULL) SELECT @NewID = MAX(ID) FROM EventTable GO 

Уровень доступа к данным возвращает int вызывающему, но должен ли он вместо этого возвращать экземпляр объекта передачи данных под названием Event? Если это правда, должен ли я возвращать как вновь созданный идентификатор, так и время начала, чтобы слой доступа к данным мог создать объект переноса события?

Все зависит от того, что вам нужно в вашем домене, используя доступ к данным. Поскольку вы создаете это, передавая информацию из уровня домена, я предполагаю, что у вас уже есть большая часть информации о событиях в вашей логике домена. В этом случае все, что вам нужно, это идентификатор, чтобы заполнить его как часть вашего объекта события, если он у вас есть.

Таким образом, все зависит от того, что вам нужно на уровне домена и по каким причинам.

Насколько вам нужно вернуться, в любом случае, вероятно, будет работать. Как сказал CodeToGlory, это зависит. Я бы склонялся к возвращению обоих ценностей.

Я бы изменил способ получения столбца идентификации в хранимой процедуре. Есть несколько способов его получить.

Вместо: SELECT @NewID = MAX (ID) FROM EXPERIMENTTABLE

Я бы сделал: Set @NewID = @@ Identity

или

Set @NewID = SCOPE_IDENTITY ()

Вот выдержка из книг на линии с примером. Я могу помочь вам решить, что использовать:

Например, есть две таблицы: T1 и T2, а триггер INSERT определен на T1. Когда строка вставлена ​​в T1, триггер запускает и вставляет строку в T2. Этот сценарий иллюстрирует две области: вставка на T1 и вставка на T2 с помощью триггера.

Предполагая, что оба T1 и T2 имеют столбцы идентификаторов, @@ IDENTITY и SCOPE_IDENTITY возвращают разные значения в конце инструкции INSERT на T1. @@ IDENTITY вернет последнее значение столбца идентификатора, вставленное в любую область текущего сеанса. Это значение, вставленное в T2. SCOPE_IDENTITY () вернет значение IDENTITY, вставленное в T1. Это была последняя вставка, которая произошла в том же объеме. Функция SCOPE_IDENTITY () возвращает нулевое значение, если функция вызывается до того, как какие-либо операторы INSERT в столбец идентификатора попадают в область видимости.

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

Вы не должны использовать MAX (ID) для извлечения основного ключа недавно добавленной записи.

Вместо этого используйте @@ Identity.

 INSERT INTO tbl(...) VALUES(...); SELECT @@Identity as NewID; 
Interesting Posts

LINQ to SQL – сопоставление хранимой процедуры с несколькими результатами и использование в webservice

Разрешить имена хостов с помощью t-sql

Как вызвать значение FK, которое является значением PK в другой таблице для процедур SQL-сервера

Перенос хранимых процедур MSSQL в MySQL

Зачем использовать SqlParameter и не встраивать параметры?

Бесконечность DateTime до SqlDateTime

Еще одна сложная проблема SQL 2000

sql объединить две строки в одну таблицу. (обновите 1-й с данными второй строки, затем удалите вторую строку)

Linq to SQL Динамический запрос в пользовательской таблице, структура которой была изменена во время выполнения

Сервер базы данных разработки SQL Server

SQL: Заменить текстовое значение в столбце, используя старые значения из другой таблицы

Расчет временной зоны sql

Почему установка текущего значения идентификации не работает для меня в SQL Server 2008 R2?

Как сделать простой «Поиск и замена» в MsSQL?

Как избежать курсора, а что наоборот?

Давайте будем гением компьютера.