SQL Scope_Identity返回0或-1

时间:2013-07-09 11:39:02

标签: c# sql stored-procedures scope-identity

我在获取最后一行受影响的ID时遇到问题,它返回0,这意味着它在插入格式时出错。我执行了存储过程并手动添加了值,它返回了正确的ID。但是当我尝试使用代码时,它会一直返回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 个答案:

答案 0 :(得分:4)

ExecuteScalar '执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略'

如果选择@fileID(而不是返回),它应该可以工作 或者,您可以在执行查询后访问@fileID参数值,在这种情况下,没有真正的点具有ExecuteScalar,您可以将其更改为ExecutenonQuery

答案 1 :(得分:0)

在SQL中使用

SET @fileID= SCOPE_IDENTITY() RETURN @fileID

SELECT @@IDENTITY;

和C#代码

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

答案 2 :(得分:0)

我最初的想法是你要取回存储过程的返回码。由于您已将其设置为OUTPUT参数,因此应由存储过程返回@fileID。从存储过程中删除RETURN。它应该传回输出变量而不是执行代码。