0

これが私のストアドプロシージャです

ALTER PROCEDURE dbo.spInsertNewTask
@ModuleID               int, 
@Task                   varchar(50), 
@StartDate              date, 
@PlannedEndDate         date, 
@EstimatedEndDate       date, 
@Status                 int,
@Comments               varchar(500),
@Started                bit
AS
INSERT INTO DTasks (ModuleID, Task, StartDate, PlannedEndDate, EstimatedEndDate, Status, Comments, Started, LastUpdated)
VALUES (@ModuleID, @Task, @StartDate, @PlannedEndDate, @EstimatedEndDate, @Status, @Comments, @Started, GETDATE())

RETURN SCOPE_IDENTITY()

新しく作成されたIDをキャプチャしようとすると、取得するのは常に1だけです。新しい行のIDをキャプチャするにはどうすればよいですか。

newID = cmd.ExecuteNonQuery();

実際、さらに処理するには、この新しいIDが必要です。

助けてくれてありがとう。

4

2 に答える 2

4

ExecuteNonQuery影響を受ける行の数を返すの代わりに、を使用して、返された行を正しいタイプにExecuteScalarキャストする必要があります。object

newID = (int)cmd.ExecuteScalar();

上記を機能させるには、SQLが戻り値を返すことから値を選択するように変更する必要もあります。

SELECT SCOPE_IDENTITY()

このページのコード例は、ほとんどあなたが探しているものです。


戻り型を保持する場合は、コマンドに戻り型パラメーターを追加し、現在のように非クエリとして実行してから、ストアドプロシージャからの戻り値の取得で説明されているように、戻りパラメーターの値を読み取る必要があります。 C#で

于 2012-10-22T15:49:09.127 に答える
1

出力パラメータとしてID列であると想定して、[ID]を渡す必要があります。

C#では、出力パラメーターである新しいパラメーターを追加し、実行の最後に以下を取得する必要があります。

初期化:

    SqlParameter param = new SqlParameter("@ID", 0);
    param.Direction = ParameterDirection.Output;
    param.DbType = DbType.Int32;

実行後に取得:

    int id = Convert.ToInt32(sqlcommand.Parameters["@ID"].Value.ToString());

ストアドプロシージャ:

    ALTER PROCEDURE dbo.spInsertNewTask
        @ID                     INT = NULL OUTPUT,
        @ModuleID               int, 
        @Task                   varchar(50), 
        @StartDate              date, 
        @PlannedEndDate         date, 
        @EstimatedEndDate       date, 
        @Status                 int,
        @Comments               varchar(500),
        @Started                bit
    AS
    BEGIN
        INSERT INTO DTasks (ModuleID, Task, StartDate, PlannedEndDate, EstimatedEndDate, Status, Comments, Started, LastUpdated)
        VALUES (@ModuleID, @Task, @StartDate, @PlannedEndDate, @EstimatedEndDate, @Status, @Comments, @Started, GETDATE())

        SET @ID = SCOPE_IDENTITY()
    END 
    GO
于 2012-10-23T08:31:33.453 に答える