【问题标题】:Stored procedure dynamic where clause, getting a value from a variable存储过程动态where子句,从变量中取值
【发布时间】:2014-12-02 00:43:50
【问题描述】:

我正在使用 sql server、c#、asp.net。我正在做一个项目,根据用户的许可从数据库中动态显示菜单。到目前为止,这是我的存储过程,

Create Proc spGetMenuData
as
Begin
 Select * from tblMenu1
End

我的数据库上有一个用户表、一个角色表和一个菜单表。 用户:userid、username、pass、roleid 角色:roleid、名称(管理员、用户) 菜单:menuid、name、url、roleid、userid 或 menuid、name、url、roleid(如果更合适,请告诉我) 现在,我想要的是获取用户 ID 和他的角色 ID 来检查菜单。我可以将用户标识从我的程序中存储到一个变量中,然后将它传递给我的存储过程。 喜欢:

Create Proc spGetMenuData
as
Begin
 Select * from tblMenu1 //(WHERE tblMenu1.userid = useridfromthevariable and tblMenu1.roleid = useridfromthevariable's roleid)
End

请帮助我,我只是一个初学者。 提前致谢!

【问题讨论】:

  • 尝试为用户菜单创建表,而不是像您的多对多表那样依赖 MENU?
  • 这是 tblMenu1 不是菜单,抱歉。这是我的用户菜单。

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

我会这样做:
用户表:user_id、username、pass、role_id
角色表:role_id、role_name
Menu_Roles 表:role_id、menu_id
菜单表:menu_id、name、url
然后我会指定菜单属于一个角色并且具有属于用户的角色。
然后获取给定用户的 menu_id、名称和 url:

CREATE PROCEDURE getMenus
    @someUserName
AS 

    SET NOCOUNT ON;
    SELECT menu_id, name, url FROM menus WHERE menu_id 
    IN (select menu_id from users
 JOIN menu_roles ON users.role_id=menu_roles.role_id WHERE username=@someUserName)
GO

【讨论】:

  • 如何将@someuserName 变量执行到存储过程?而且你不能从用户中选择menu_id
  • 您将其从 C# 应用程序传递到存储过程。然后在存储过程的开头声明它,例如@someUsername VARCHAR(100)。您也是正确的,menu_id 不在用户中,应该已经阅读了 role_id。我会编辑它。
  • 你会推荐我做简单的命令而不是存储过程吗?
  • 如果使用存储过程,维护起来很容易。如果您的应用程序发生巨大变化,您可以将所有数据库代码放在一个地方。但是,我目前是一名 .NET 开发人员,如果我可以将查询放入我的应用程序代码中,我会这样做。我会创建一个单独的类来放入我所有的数据库相关代码,比如 dbHelper.cs。然后我调用 dbHelper 类的各种函数来检索数据。这样,如果我确实需要更改我的数据库代码,我可以在 dbHelper 类中找到它。
  • 这远远超出了这个问题的范围。网上有很多关于如何通过 .NET 应用程序与 SQL Server 通信的资源。 msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多