2

ASP.NETMVC3プロジェクトに次のように挿入します。

var query = "INSERT INTO MyTable VALUES(//some values)";
db.Database.ExecuteSqlCommand(query);

挿入された行のIDを取得する簡単な方法はありますか?

編集:

私のストアドプロシージャ:

CREATE PROCEDURE addGetID
( 
    @PersonnelID INT,
    @ShiftWorkID BIGINT,
    @EntranceDateTime DATETIME,
    @WorkflowStateRelationID BIGINT
)
AS
INSERT INTO DynamicDataEntrances VALUES (@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID)
SELECT @@IDENTITY

私のコード行:

string dt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
SqlParameter PersonnelID = new SqlParameter("@PersonnelID", 1);
SqlParameter ShiftWorkID = new SqlParameter("@ShiftWorkID", 2);
SqlParameter EntranceDateTime = new SqlParameter("@EntranceDateTime", dt);
SqlParameter WorkflowStateRelationID = new SqlParameter("@WorkflowStateRelationID ", db.WorkflowStateRelations.Where(wsr => wsr.WorkflowID == dp.WorkflowID).Select(x => x.ID).FirstOrDefault());
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;

// try 1
db.Database.ExecuteSqlCommand("addGetID(@PersonnelID, @ShiftWorkID, @EntranceDateTime, @WorkflowStateRelationID )", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

// try 2
db.Database.ExecuteSqlCommand("addGetID @PersonnelID @ShiftWorkID @EntranceDateTime @WorkflowStateRelationID ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

// try 3
db.Database.ExecuteSqlCommand("exec addGetID @PersonnelID={0} @ShiftWorkID={1} @EntranceDateTime={2} @WorkflowStateRelationID={3} ", PersonnelID, ShiftWorkID, EntranceDateTime, WorkflowStateRelationID, returnValue);

var id = returnValue.Value;
4

3 に答える 3

4

これについては [scartag][1] に同意します。しかし、あなたの質問に2つの部分で答えるために。

ダイレクト SQL を使用する場合は、値を返すストアド プロシージャを作成し@@IDENTITYます。次に、パラメータを使用して Sp を実行し、ParameterDirection.ReturnValueその値を使用します。

そのような:

SqlParameter entityField = new SqlParameter("@firstName", "Frank");
SqlParameter returnValue = new SqlParameter();
returnValue.Direction = ParameterDirection.ReturnValue;
db.Database.ExecuteSqlCommand("sp_ByPassEFAndInsertEntity(@firstName)", 
                              entityField, returnValue);
var id = returnValue.Value;

または単にEFを使用してください。を作成して初期化Entityし、該当する に追加して、DbSetsavechanges を呼び出します。Entity インスタンスの Id 列は、データベースによって生成された値で更新されます。

編集 2: 最初のソリューションを私のローカル db に適用し、それを取得して戻り値を返すことができました。いくつかの調査の後、戻り値を取得することができました。ブログ テーブルを持つローカル データベースがあります。addBlog SP を作成しました。これが戻り値を取得する方法ですが、ExecSqlCommand を使用する代わりに SqlQuery を使用する必要があります。

ここに私のSPがあります:

    ALTER PROCEDURE [dbo].[addBlog] 
        @BlogName varchar(50),
        @CreateDateTime datetime
    AS
    BEGIN
        insert into Blog (Name, DateTimeCreated) values (@BlogName, @CreateDateTime)
        declare @return int
        set @return = @@identity
        select @return
    END

そして私のEFコード:

    using (var db = new StackOverflowEntities()) {
        SqlParameter blogName = new SqlParameter("BlogName", "New Name 2");
        SqlParameter createDate = new SqlParameter("CreateDate", DateTime.Now);

        int? newIdentityValue = db.Database.SqlQuery<Int32>("addBlog @BlogName, @CreateDate", blogName, createDate).FirstOrDefault();

        Debug.WriteLine(newIdentityValue);
    }
于 2013-01-06T14:00:05.853 に答える
1

いいえ。このメソッドから挿入された行の ID を取得することはできません。

int のみを返します (影響を受ける行の数を示します)。

あなたのコードは、あなたが既に EF を使用していることを示しているので、API の他の側面を使用しないのはなぜですか?

生の SQL ルートに熱心に取り組んでいるように見えるので、dapper、masssive、petapoco などのツールを使用してみませんか?

于 2013-01-06T13:45:43.697 に答える
-1
SELECT scope_identity()

戻り値として

于 2013-04-19T13:10:02.540 に答える