Почему @@ Identity возвращается null? - PullRequest
3 голосов
/ 06 октября 2010

У меня есть приложение .NET 2010, использующее базу данных SQL2000. Код довольно простой. Когда я вставляю запись, запись вставляется, но идентификатор не возвращается. Столбец id - это int, а это Idetity. Здесь хранится процедура ...

ALTER PROCEDURE Insert_Vendor

@CorpID as varchar(255), 
@TaxpayerID as varchar(255)
AS

Insert into  dbo.Vendor
(
vdr_CorpID, 
vdr_TaxpayerID
)
values
(
@CorpID, 
@TaxpayerID
)

        IF @@error <> 0 
            BEGIN
                RETURN -1
            END
        ELSE 
        RETURN @@Identity
GO

А на приемном конце ...

 int myID = (int)(db.ExecuteScalar(dbCommand));

Ответы [ 5 ]

6 голосов
/ 06 октября 2010
  • Вы всегда должны использовать SCOPE_IDENTITY ()
  • NULL нельзя вернуть через RETURN из сохраненного процесса. Вы получите предупреждение SQL и оно вернет ноль.
  • ExecuteScalar ищет 1-ую строку, 1-ую колонку набора записей. Нет записей выше

... Так что вы бы использовали SELECT SCOPE_IDENTITY(), а не RETURN SELECT SCOPE_IDENTITY()

2 голосов
/ 06 октября 2010

ExecuteScalar

выполняет запрос и возвращает первый столбец первого ряда в набор результатов, возвращаемый запросом

Итак, вам нужно переписать оператор RETURN как

SELECT -1

и

SELECT CAST(SCOPE_IDENTITY() AS INT)

соответственно

1 голос
/ 06 октября 2010

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

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

Во-вторых, я бы предложил вместо

RETURN

использовать

SELECT SCOPE_IDENTITY()

Наконец, я бы сказал, почему бы не простоиспользуйте параметр OUTPUT против возврата результата.У меня нет ничего, чтобы поддержать это следующее заявление, но я думаю, что это лучше.Опять же, никаких доказательств этому нет, но кажется, что с выходным параметром и набором результатов, который поставляется со схемой, это выглядит как издержки.

Только мои мысли.

1 голос
/ 06 октября 2010

Вы должны позвонить @@ IDENTITY сразу после вставки, вместо этого используйте Scope_identity ().

0 голосов
/ 07 октября 2010

Я бы лично рекомендовал использовать SCOPE_IDENTITY вместо @@ IDENTITY. При этом проблема заключается в хранимой процедуре. Devio выше было правильно, скаляр выполнения ищет первый столбец первого ряда. Оператор RETURN не будет этого делать, поэтому вам нужно будет использовать один из следующих пунктов:

    IF @@error <> 0 
    BEGIN
        Select -1
    END
    ELSE 
    Select @@Identity

или

    IF @@error <> 0 
    BEGIN
        Select -1
    END
    ELSE 
    Select SCOPE_IDENTITY()
...