3

我在获取最后一行受影响的 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)
);
4

3 回答 3

4

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

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

于 2013-07-09T11:42:46.020 回答
0

在 SQL 中使用

SET @fileID= SCOPE_IDENTITY() RETURN @fileID

SELECT @@IDENTITY;

并在 C# 代码中

 int returnfileID = Convert.ToInt32(cmdInsert.ExecuteScalar())
于 2013-07-09T11:45:58.237 回答
0

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

于 2013-07-09T11:57:59.270 回答