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. Удалите ВОЗВРАТ из вашей хранимой процедуры. Он должен передавать обратно выходную переменную, а не код выполнения.