簡體   English   中英

如何使用實體框架執行存儲過程並從存儲過程獲取輸出

[英]How to execute stored procedure and get output from the stored procedure using Entity Framework

我一直在嘗試通過調用存儲過程並使用EF6插入一條記錄,並嘗試從該存儲過程中獲取輸出,該存儲過程是新創建的ID,但仍會碰壁。

我有一個存儲過程,其ContactID的輸出

CREATE PROCEDURE [dbo].[usp_InsertContact]
    @ContactID int output,
    @Name nvarchar(50)
AS
insert into [Contact]
    (Name) values (@Name)
    set @ContactID = @@IDENTITY

我正在調用存儲過程並傳遞這樣的值...

return Convert.ToInt32(AWJE.Database.SqlQuery<int>
   ("usp_InsertContact @Name", contact.Name));

那還是行不通的,我遇到了以下錯誤...(而且我早些發布了該錯誤並親自回答了它,但行不通)。

System.Data.Entity.Infrastructure.DbRawSqlQuery`1 [System.Int32]'鍵入“ System.IConvertible錯誤”

然后我去嘗試了...

return AWJE.Database.ExecuteSqlCommand
    ("exec usp_InsertContact @Name", contact.Name);

調用此方法時,出現以下錯誤...

附加信息:必須聲明標量變量“ @Name”。

如您所見,變量@Name位於存儲過程中,並且我正在傳遞變量@Name。

所以我嘗試了這個

return AWJE.Database.ExecuteSqlCommand
   ("exec usp_InsertContact @ContactID OUTPUT, @Name", contact.Name);

這給出了這個錯誤...

附加信息:必須聲明標量變量“ @ContactID”。

因此,我對如何執行此操作有些迷失,我知道如何嚴格使用ADO.NET進行此操作。 我到處尋找答案,但不理解我看到的示例,因為我看到的示例與SqlParameter.Add等混合在一起...

而不是給您逐步介紹的詳細說明。 Ť

基本上,有兩種直接在EF上執行此操作的方法,另一種僅使用純SQL。

在EF中,您必須將sproc作為函數添加,此處是有關如何執行此操作的文章https://msdn.microsoft.com/zh-cn/data/gg699321.aspx

或像這樣的純sql方式,

SqlParameter p1= new SqlParameter("@p1", "Test");
SqlParameter p2 = new SqlParameter("@p2", "Test2");

//Executing the stored procedure from your database context
context.Database.ExecuteSqlCommand("sp_StoredProc @p1, @p2", p1, p2);

試試吧

using (ConEntities context = new ConEntities())
    {
    // ContactID is an output parameter.
    ObjectParameter ContactID = new ObjectParameter("ContactID", typeof(int));
    SqlParameter Name = new SqlParameter("@Name", "hello sir");
    context.usp_InsertContact(ContactID, Name);
    //Console.WriteLine(ContactID.Value); 
    }

我們也可以這樣

var parameters = new[] { 
        new SqlParameter("@0", SqlDbType.Int32) { Direction = ParameterDirection.Output }, 
        new SqlParameter("@1", "MY Name")
    };

    context.ExecuteStoreCommand("exec usp_InsertContact @ContactID =@0 output, @Name =@1", parameters);

    int d = (int)parameters[0].Value;

我這樣做

   var outputId = new SqlParameter { ParameterName = "outputId", Value = 0, Direction = System.Data.ParameterDirection.Output };

    Database.ExecuteSqlCommand(
        @"spProcedureName @p1, @outputId out",
        new SqlParameter("p1", HttpContext.Current.User.Identity.Name),
        outputId
    );

   return Convert.ToInt32(outputId.Value);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM