存储过程需要参数:参数显示在分析器中......?

时间:2012-03-01 17:22:26

标签: sql c#-4.0 dbcontext

我使用DbContextSqlQuery()调用存储过程。当我运行查询时,我收到错误Procedure or function 'p_Insert_Phones' expects parameter '@Number', which was not supplied.我在这里缺少什么?我看到了@Number参数。

declare @p5 nvarchar(255)

set @p5=NULL

exec sp_executesql N'p_Insert_Phones',
     N'@Number int,
     @PhoneTypeId int,
     @ReturnId nvarchar(255) output',
     @Number=0,
     @PhoneTypeId=0,
     @ReturnId=@p5 output

select @p5

修改

程序定义

CREATE PROCEDURE [dbo].[p_Insert_Phones]
(
    @Number int,
    @PhoneTypeId int,
    @ReturnId uniqueidentifier out
) 
AS 
DECLARE @id TABLE(
    ReturnColId uniqueidentifier
) 

BEGIN TRAN 
    INSERT INTO Phones ([Number],[PhoneTypeId]) 

    OUTPUT inserted.Id 
    INTO @id 
    VALUES (@Number,@PhoneTypeId) 
COMMIT TRAN 

SET @ReturnId = (SELECT ReturnColId FROM @id)

2 个答案:

答案 0 :(得分:0)

请尝试以下方法:

this.context.Database.SqlQuery<string>("p_Insert_Phones @Number = {0}, @PhoneTypeId = {1}", 0, 0);

this.context是您要使用的上下文。 SqlQuery方法的泛型类型参数是查询结果的返回类型,在您的情况下是nvarchar,它会生成字符串类型。

(未经测试,但它是基于我在其中一个项目中使用过的代码的模型)。

答案 1 :(得分:0)

您无法调用数据库中找到的存储过程。存储过程将找不到您提供的参数。我通过在DbContext调用中将存储过程包含为sql来解决了这个问题。

var sqlInsert = "DECLARE @id TABLE(ReturnColId uniqueidentifier) " + 
"BEGIN TRAN INSERT INTO Phones " +
    "([Number],PhoneTypeId]) " +
    "OUTPUT inserted.Id " +
    "INTO @id " +
    "VALUES (@Number,@PhoneTypeId) " +
"COMMIT TRAN " +

"SET @ReturnId = (SELECT ReturnColId FROM @id)"

var sqlTransaction = context.Database.SqlQuery(type, insertProcedure, parameters.ToArray());

foreach (var record in sqlTransaction) { } // executes the lazy loading in order to
                                           // populate the out parameter.

Guid newId = new Guid(parameters[parameters.Count - 1].Value.ToString());