如何读取多个表并根据用户的角色将用户重定向到不同的页面

时间:2018-09-18 09:55:53

标签: c# sql-server visual-studio

我目前正在登录页面上工作,该页面可以将不同的角色(家长和老师)重定向到不同的页面。但是,我的Microsoft SQL Server数据库中有3个表:

[帐户]

AID(PK)|用户名|密码

[account_role]

角色ID(PK)(FK)|援助(PK)(FK)

[角色]

角色ID(PK)| RName

我试图验证不同的用户,一旦他们单击登录按钮并将其重定向到其他页面。我认为问题出在这里:

...//val df1
...//val df2
...//val df3
...//val finalDf 

finalDf.show()

+---------+--------------------+-------+
| userId  | area    |  flag |rowId|
+---------+--------------------+-------+
|123      |[Blah1...|   true|    0|
|234      |[Blah2...|   true|    1|
|216      |[Blah3...|   true|    2|
|123      |[blah4...|  false|    6|
|345      |[Blah5...|   true|    7|
|677      |[Blah6...|  false|    8|

表[role]中的RName列与[account]不在同一表中,那么如何更改它以使其起作用?请帮助

2 个答案:

答案 0 :(得分:1)

您必须join

SELECT r.RName
FROM
    account a
    INNER JOIN account_role ar
        ON a.AID = ar.AID
    INNER JOIN role r
        ON ar.RoleID = r.RoleID
WHERE
    a.username = @user

最好使用命令参数

roleCom .Parameters.AddWithValue("@user", TextBoxUser.Text);

请注意,使用命令参数时,SQL文本不包含任何字符串定界符。参数机制负责转义嵌入的撇号,格式化日期等。它还可以防止SQL Injection

答案 1 :(得分:1)

public string GetRole(string userName)
{
    using (SqlConnection dbConn = new SqlConnection(_connectionString))
    {
        dbConn.Open();
        try
        {
            var query = @"select r.rname from role r
                            join account_role ar
                              on r.roleid = ar.roleid
                            join account a
                              on a.aid = ar.aid
                          where a.username = ""@userName""";
            using (SqlCommand dbCommand = new SqlCommand(query, dbConn))
            {
                dbCommand.Parameters.Add("@userName", SqlDbType.VarChar).Value = userName;

                SqlDataReader reader = dbCommand.ExecuteReader();
                if (reader.Read())
                {
                    var result = reader.GetString(0);
                }
            }
        }
        catch (SqlException)
        {
            throw; // bubble up the exception and preserve the stack trace
        }

        dbConn.Close();

        return result;
    }
}