2011-11-18 158 views
0

我需要检查用户是否有权根据他们的角色进行访问。 (ASP.NET和SQL Server)如何从查询返回布尔值

SELECT rf.ReadAccess 
FROM aspnet_Users as u INNER JOIN aspnet_Roles as r ON r.UserID=u.UserID 
INNER JOIN RolesByForm as rf ON rf.RoleID=r.RoleID 
WHERE [email protected] 

所以这让我接近,但这是我真正想要的。我希望表单默认可见,所以如果RolesByForm中没有记录,它应该是“真”。但是如果有记录,它应该根据ReadAccess字段返回。

如何获取查询以返回布尔值?

+0

这对发布使用这个查询的ASP.NET代码也是有帮助的。 – jlarson

+0

如果没有记录,则没有记录。您不应该依赖SQL查询来默认显示您的表单,而是使用代码。 – Otiel

+0

TSQL中没有布尔值。但是,您可以返回0或1的BIT,您可以使用三元函数在您的应用程序中投射。 – SQLMason

回答

0
SELECT ReadAccess=CASE rf.ReadAccess WHEN 1 THEN 'True' ELSE 'False' END 
FROM aspnet_Users as u INNER JOIN aspnet_Roles as r ON r.UserID=u.UserID 
INNER JOIN RolesByForm as rf ON rf.RoleID=r.RoleID 
WHERE [email protected] 

而在你的.NET代码写例如:

bool result; 
bool myBoolean=Boolean.TryParse(dataset["ReadAccess"], out result); 
0

在.NET SQL服务器领域BIT是真的还是假的,所以:

CAST (rf.ReadAccess as BIT) 

或者,如果ReadAccess是一个varchar:

CASE ReadAccess 
    WHEN 'Something' THEN CAST(1 as bit) 
    ELSE CAST (0 as bit) 
END 
1

尝试

SELECT case count(rf.ReadAccess) when 0 then 'True' else 'False' end ReadAccess 
FROM aspnet_Users as u INNER JOIN aspnet_Roles as r ON r.UserID=u.UserID 
INNER JOIN RolesByForm as rf ON rf.RoleID=r.RoleID 
WHERE [email protected] 
0

假设rf.ReadAccess是位字段(1或0),那么要一个外部联接到捕获rolesbyform记录的非存在性。

也许这样的事情?

SELECT distinct isnull(rf.ReadAccess, 1) as ReadAccess 
FROM aspnet_Users as u INNER JOIN aspnet_Roles as r ON r.UserID=u.UserID 
LEFT OUTER JOIN RolesByForm as rf ON rf.RoleID=r.RoleID 
WHERE [email protected] 
0

您可以返回0(false)和1(true)。试试这个例子:

CREATE PROCEDURE CheckReadAccess 
@UserID INT 
AS 

BEGIN 
DECLARE @rdAxs VARCHAR(255) 

    SELECT @rdAxs = rf.ReadAccess 
    FROM aspnet_Users as u INNER JOIN aspnet_Roles as r ON r.UserID=u.UserID 
    INNER JOIN RolesByForm as rf ON rf.RoleID=r.RoleID 
    WHERE [email protected] 

    IF @rdAxs IS NULL 
     RETURN 0 
    ELSE 
     RETURN 1 

END