存储过程返回带有linq数据上下文的值
本文关键字:上下文 数据 linq 返回 存储过程 | 更新日期: 2023-09-27 18:09:42
我正在尝试使用Linq 访问存储过程的返回值
DECLARE @ValidToken int = 0 //I have also tried using a bit instead of an int here.
IF EXISTS(SELECT 1 FROM Tests WHERE TestToken = @Token)
select @ValidToken = 1
return @ValidToken
这在通过sql studio运行SP时有效。然而,我尝试使用datacontext类用linq运行它,它总是返回-1。
using (DataEntities dataEntities = new DataEntities())
{
int query = data.ValidateToken(id);
Response.Write(query.ToString());
}
查询总是等于-1,我不知道为什么。
我在网上看了看,似乎有更容易的方法来获得返回值,但我宁愿坚持使用Linq,因为这是程序的其他部分正在使用的。
为什么都使用存储过程作为函数?
虽然存储过程有return
,但它不是一个函数,所以不应该使用return
返回数据,
相反,您应该使用Output参数和其他方式来返回数据,如MSDN 中所述
return
的使用记录在MSDN 中
误用return
可能是LINQ不理解您的存储过程的原因。
我就是这么做的,而且很管用。
在Sqlserver:中
ALTER PROCEDURE [dbo].[ValidateToken]
-- Add the parameters for the stored procedure here
@Id int
AS
BEGIN
DECLARE @Ret INT
SELECT
@Ret = COUNT(*)
FROM Test
set @Ret =@Id+1;
select @Ret
END
在C#中:
static void Main(string[] args)
{
using (SergioEntities dm = new SergioEntities())
{
int? validToken = 1;
int? a = dm.ValidateToken(validToken).First();
}
}
试试看:(
尝试将RETURN 0/1语句更改为SELECT 0/1
代码的问题是使用IF(query)
,而不是像使用IF EXISTS(query)
一样使用它,所以代码如下所示
CREATE PROCEDURE [dbo].[MyProc]
AS
BEGIN
DECLARE @Ret INT
//use of IF EXISTS instead of IF
IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
SELECT @Ret = 0
ELSE
SELECT @Ret = 1
RETURN @Ret
END
你的代码可能看起来像
using (TestDBDataContext db = new TestDBDataContext())
{
//For Stored Procedure with Return value (for Integer)
//returns Int
var q = db.MyProc();
Console.WriteLine(q);
}
如果这不起作用,那就去其他解决方案
- 输出参数
- 使用标量值函数
这里讨论的是:LINQ到SQL:从存储过程返回标量值
CREATE PROCEDURE [dbo].[MyProc]
AS
BEGIN
DECLARE @Ret INT
// use of IF EXISTS instead of IF
IF EXISTS(SELECT * from Tests WHERE TestToken = @Token)
SELECT @Ret = 0
ELSE
SELECT @Ret = 1
RETURN @Ret
END