Должен ли я возвращать первичный ключ в строку или объект передачи данных после создания новой строки в базе данных? - PullRequest
2 голосов
/ 01 мая 2009

У меня есть трехуровневая система, серверная часть 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? Если это правда, должен ли я возвращать как вновь созданный идентификатор, так и время начала, чтобы слой доступа к данным мог создать объект передачи события?

Ответы [ 4 ]

3 голосов
/ 01 мая 2009

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

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

2 голосов
/ 01 мая 2009

Что касается того, что вам нужно вернуть, то в любом случае, вероятно, сработает. Как сказал CodeToGlory, это зависит. Я бы склонялся к тому, чтобы вернуть оба значения сам.

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

Вместо: SELECT @NewID = MAX (ID) из таблицы экспериментов

Я бы сделал: Установить @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 в столбце идентификаторов появятся в области действия.

1 голос
/ 01 мая 2009

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

0 голосов
/ 01 мая 2009

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

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

INSERT INTO tbl(...) VALUES(...);

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