如何使用Entity Framework执行存储过程并从存储过程获取输出

时间:2015-08-01 18:58:51

标签: c# sql-server entity-framework stored-procedures

我一直试图通过调用存储过程并尝试从存储过程中获取输出来尝试插入记录,该存储过程是新创建的ID,但仍然在砖墙中运行。

我有一个存储过程,其OUTPUT为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]&#39;键入&#39; System.IConvertible Error

然后我去尝试了这个......

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

当这个被调用时,我得到以下错误......

  

附加信息:必须声明标量变量&#34; @ Name&#34;。

正如您所看到的,变量@Name在存储过程中,并且我传递变量@Name。

然后我尝试了这个

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

这就是错误......

  

附加信息:必须声明标量变量&#34; @ ContactID&#34;。

所以我对如何做到这一点很遗憾,我知道如何使用ADO.NET严格执行此操作。 我已经四处寻找答案,但没有理解我见过的例子,因为我看到的例子与SqlParameter.Add等混合......

3 个答案:

答案 0 :(得分:0)

而不是一步一步地给你深入描述如何做到这一点。 Ť

这里基本上有两种方法可以直接使用EF,另一种只使用纯SQL。

在EF中你必须添加你的sproc作为函数这里是一篇关于如何做的文章https://msdn.microsoft.com/en-us/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);

答案 1 :(得分:0)

试试吧

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;

答案 2 :(得分:0)

我这样做

   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);