我正在尝试使用 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,因为这是程序的其余部分正在使用的。
这是我所做的,并且有效。
在 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);
}
如果这不起作用,请寻求其他解决方案
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
如果您在存储过程中使用“select” 这是工作代码 -
ALTER PROCEDURE [dbo].[sp_GetData]
-- Add the parameters for the stored procedure here
@Id int
AS
BEGIN
DECLARE @Ret INT
SELECT @Ret = COUNT(*) FROM Test
set @Ret =@Id+1;
set @Ret1 =@Id+2;
select @Ret as Id, @Ret1 as Id2
END
C# 代码 -
using (DataAccessDataContext db = new DataAccessDataContext())
{
Cls_Response rtn = new Cls_Response();
try
{
var SP_data = db.sp_GetData(....params...);
foreach (var c in SP_data)
{
rtn.Id = c.Id;
rtn.Id2 = c.Id2;
rtn.Status = true;
rtn.Message = "success";
}
}
catch (Exception ex)
{
rtn.Id = null;
rtn.Id2 = null;
rtn.Status = false;
rtn.Message = ex.Message;
}
return rtn;
}
public class Cls_Response
{
public bool Status { get; set; }
public string Message { get; set; }
public long? Id { get; set; }
public long? Id2 { get; set; }
}
这是回复 -
{
"Status": true,
"Message": "success",
"Id": 1,
"Id2": 2
}