2010-10-06 3 views
3

У меня есть приложение .NET 2010, поражающее SQL2000 db. Код довольно простой. Когда я вставляю запись, запись вставляется, но идентификатор не возвращается. Столбец id - это int, и это идентификация. Вот ХП ...Почему @@ Identity возвращает null?

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)); 
+0

Что возвращается? – spinon

+1

@spinon: Я верю в название вопроса, что OP сказал, что «NULL» возвращается. –

+0

@ Джо, вы правы. Я думал, что прочитал его где-то, но не видел этого в вопросе. Я забыл посмотреть название. Спасибо что подметил это! – spinon

ответ

1

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

+0

В этом случае не поможет. Правильно получить последний вставленный идентификатор, но все равно не вернуть данные клиенту. – gbn

1

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

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

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

RETURN 

использования

SELECT SCOPE_IDENTITY() 

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

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

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

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

2

ExecuteScalar

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

Так что вам нужно переписать RETURN s как

ОТЧЕТНОСТИ
SELECT -1 

и

SELECT CAST(SCOPE_IDENTITY() AS INT) 

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

0

лично я бы рекомендовал использовать 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() 
+0

Упс не видел ответа Devio ... – DevDave

Смежные вопросы