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 (return の代わりに) を選択すると、動作するはずです。
または、クエリを実行した後に @fileID パラメーター値にアクセスすることもできます。その場合、ExecuteScalar を持つ実際のポイントはありませんExecutenonQuery

于 2013-07-09T11:42:46.020 に答える
0

私の最初の考えは、ストアド プロシージャのリターン コードが返されているということです。@fileID は、OUTPUT パラメーターとして設定したため、ストアド プロシージャによって返されるはずです。ストアド プロシージャから RETURN を削除します。そのように実行コードではなく、出力変数を返す必要があります。

于 2013-07-09T11:57:59.270 に答える
0

SQL での使用

SET @fileID= SCOPE_IDENTITY() RETURN @fileID

SELECT @@IDENTITY;

そしてC#コードで

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