我使用DbContext
从SqlQuery()
调用存储过程。当我运行查询时,我收到错误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)
答案 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());