SQL Scope_Identity возвращает 0 или -1

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

C#:

conn.Open();

            cmd.Parameters.AddWithValue("@fileName", fileName);
            cmd.Parameters.AddWithValue("@filePrivacy", filePrivacy);

            cmd.Parameters.AddWithValue("@filePassword", filePassword);

            cmd.Parameters.AddWithValue("@fileDescription", fileDesc);
            cmd.Parameters.AddWithValue("@fileOwner", fileOwner);
            cmd.Parameters.AddWithValue("@fileDate", DateTime.Now);
            cmd.Parameters.AddWithValue("@fileExpire", DateTime.Now.AddMinutes(fileExpire));
            cmd.Parameters.AddWithValue("@fileCodeText", fileType);
            var fileID = cmd.Parameters.Add("@fileID", SqlDbType.Int);
            fileID.Direction = ParameterDirection.Output;

            int returnfileID = (int)cmd.ExecuteScalar();
            return returnfileID;

Хранимая процедура:

CREATE PROCEDURE [dbo].[Upload]
@fileName nvarchar(20),
@filePrivacy int,
@filePassword nvarchar(50),
@fileDescription nvarchar(200),
@fileOwner nvarchar(14),
@fileDate smalldatetime,
@fileExpire smalldatetime,
@fileCodeText int,
@fileID int out

AS
INSERT INTO Files ([FileName], FilePrivacy, FilePassword, FileDescription, FileOwner, FileDate, FileExpire, FileCodeText)
VALUES (@fileName, @filePrivacy, @filePassword, @fileDescription, @fileOwner, @fileDate, @fileExpire, @fileCodeText)
SET @fileID = SCOPE_IDENTITY()
RETURN @fileID

Таблица SQL:

CREATE TABLE [dbo].[Files] (
[Id]              INT            IDENTITY (1, 1) NOT NULL,
[FileName]        NVARCHAR (20)  NOT NULL,
[FilePrivacy]     INT            NOT NULL,
[FilePassword]    NVARCHAR (50)  NULL,
[FileDescription] NVARCHAR (200) NULL,
[FileOwner]       NVARCHAR (14)  NOT NULL,
[FileDate]        SMALLDATETIME  NOT NULL,
[FileExpire]      SMALLDATETIME  NOT NULL,
[FileCodeText]    INT            NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);

3 ответа

Решение

ExecuteScalar 'Выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращенных запросом. Дополнительные столбцы или строки игнорируются

Если вы выберете @fileID (вместо return), оно должно работать.
В качестве альтернативы вы можете получить доступ к значению параметра @fileID после выполнения запроса, и в этом случае нет реальной точки, имеющей ExecuteScalar, вы можете изменить его на ExecutenonQuery,

Использовать в SQL

SET @fileID= SCOPE_IDENTITY() RETURN @fileID

SELECT @@IDENTITY;

и в коде C#

 int returnfileID = Convert.ToInt32(cmdInsert.ExecuteScalar())

Сначала я думал, что вы возвращаете код возврата хранимой процедуры. @fileID должен быть возвращен вашей хранимой процедурой, поскольку вы установили его в качестве параметра OUTPUT. Удалите ВОЗВРАТ из вашей хранимой процедуры. Он должен передавать обратно выходную переменную, а не код выполнения.

Другие вопросы по тегам