为什么实体框架的ExecuteSqlCommand方法无法读取存储过程out参数?

时间:2019-01-17 08:15:19

标签: c# sql sql-server entity-framework entity-framework-6

我正在尝试读取存储过程返回的OUT参数值,但它抛出错误 DBNULL 。甚至该过程都在返回值。

代码:

   int? outParam= 0;

   SqlParameter sqlParam= new SqlParameter("@model", user.Name+" Model");
   SqlParameter sqlParamOut = new SqlParameter("out", outParam);
   sqlParamOut.DbType = System.Data.DbType.Int32;
   sqlParamOut.Direction = System.Data.ParameterDirection.Output;

   UsersPhonesDBContext.Database.ExecuteSqlCommand("dbo.InsertPhones @model, @out", sqlParam, sqlParamOut);

   outParam = Convert.ToInt32(sqlParamOut.Value);

SP:

alter PROCEDURE InsertPhones (

    @model varchar(100),
    @out int output
)
AS
BEGIN
        Insert into Phones (Model, Manufacturer)
        Values 
        (
            @model,
            'Hunain Phone'
        )

        set @out= SCOPE_IDENTITY();
        Select @out
END
GO

1 个答案:

答案 0 :(得分:3)

SQL Server中的

out参数很有趣。您必须在任何地方重复自己。

具体地说,在这里,您忘记了在调用存储的proc时在参数列表中提及它。 dbo.InsertPhones @model, @out应该是dbo.InsertPhones @model, @out out。也许还有一种方法可以从此字符串中省略参数列表,并指示SQL Server为它指定一个存储过程名称,而不是任意查询文本,但是我不确定在此如何具体使用( SqlCommand对象,可以通过CommandType属性)。

如果您使用的是out参数,则不需要在存储过程的末尾使用select,但是我认为这是一种修复方法。