2

自動インクリメントされた主キーを持つテーブルがあります。私のコードでは、各「挿入」クエリを実行するときに、新しい自動インクリメント値を受け取ろうとしています。プログラムでそれを行う方法はありますか?

ありがとう。

UPD:テーブルがあると仮定します:TABLE User(userID INT NOT NULL AUTO_INCREMENT、name VARCHAR(25)NOT NULL、email VARCHAR(50)NOT NULL、UNIQUE(userID));

そして、このテーブルに新しい値(名前と電子メール)を挿入すると、新しく生成されたuserIDを自動的に受け取ります。理想的には、単一のトランザクションで、ストアドプロシージャなしでそれを行う方法を探しています。

4

5 に答える 5

4

sql /ストアドプロシージャにscope_identity()を返すようにするか、Linq2SQLまたはEFを使用している場合は、挿入に使用されるエンティティが新しいIDを取得します。

于 2009-09-09T23:38:08.940 に答える
4

ストアドプロシージャでは、次のようになります。

ALTER    proc [dbo].[SaveBuild](
@ID int = 0 output,
@Name varchar(150)=null,
@StageID int,
@Status char(1)=null
)
as
 SET NOCOUNT ON


    Insert into Builds
    (name, StageID, status)
    values (@Name, @StageID, @Status)

    select @ID = scope_identity()

RETURN @ID

C#コードには次のものがあります。

public int SaveBuild(ref int id, ref string Name)
{

    SqlCommand cmd = GetNewCmd("dbo.SaveBuild");

    cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
    cmd.Parameters["@ID"].Direction = ParameterDirection.InputOutput;

    cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = Name;
    cmd.Parameters.Add("@StageID", SqlDbType.Int).Value = 0;

    ExecuteNonQuery(cmd);
    id = (int)cmd.Parameters["@ID"].Value;

    return id;

}
于 2009-09-09T23:40:32.460 に答える
3

状況によっては、テーブル値パラメーターを使用してインサートをストアード・プロシージャーに渡し、次にOUTPUTINSERTEDを使用してストアード・プロシージャーからテーブル値パラメーターを返す方がよい場合があります。

複数のアイテムを処理している場合、必要なヒット数が大幅に削減されます。

于 2009-09-09T23:43:37.693 に答える
1

SQLステートメントを使用できますSELECT scope_identity()

于 2009-09-09T23:38:21.090 に答える
1

クライアントでSQLを構築し、それをサーバーに送信することに制限されていますか?ストアドプロシージャを使用できる場合、これは簡単に実行できます。ストアドプロシージャで、挿入を実行してから、次のいずれかを実行します。

  1. ストアドプロシージャの最後のステートメントとしてScope_Identity()を選択するか、または
  2. ストアドプロシージャ(@NewPKValueなど)への出力パラメーターを使用して、最後のステートメントを作成します。

    @NewPKValue = Scope_Identity()を設定します

それ以外の場合は、insertとSelect Scope_Identity()の2つのステートメントを含むコマンドのバッチをサーバーに送信し、selectステートメントであるかのようにバッチを実行する必要があります。

于 2009-09-09T23:40:53.630 に答える