1

我是编程和使用的新手SQL Server Compact,我正在做这个个人项目来学习,所以非常感谢任何帮助。

我试图隐藏成功登录buttonMain Form取决于用户类型的帐户。

在我的数据库中,我有 3 列,它们usernamepasswordtype - (this is what I am trying to access for this project)

我认为要获得我想要的效果,我必须处理 Main_load 所以这是我放置此代码的地方:

    private void Main_Load(object sender, EventArgs e)
    {
        admincontrolbtn.Visible = false;
        conn = new SqlCeConnection("Data Source=Users.sdf; Persist Security Info = False");
        comm = new SqlCeCommand("Select * from [user]", conn);
        reader = comm.ExecuteReader();
        while (reader.Read())
        {
            try
            {
                conn.Open();
                if (reader.GetString(2) == "Administrator")
                {
                    admincontrolbtn.Visible = true;
                }
                else
                {
                    admincontrolbtn.Visible = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                conn.Close();
            }
        }
    }

当我构建代码时,没有发现错误。我以为我走在正确的轨道上。但是,当我使用具有 的凭据登录时User" typebutton仍然可见。我已经尝试通过在Main_load自身上放置一个中断来调试代码,但是当我运行它并登录时,它会显示主页,完全忽略 Main_load。

我还尝试将属性的可见性设置button为 false,但是当主页加载时,即使使用管理员类型的凭据,也会button保持隐藏状态。

代码的语法错了吗?和/或也许我的思维方式Main_load是我的目标错误?

4

3 回答 3

0

通常,当用户登录时,您会创建一个包含该用户所有相关信息的用户对象。然后,您不必每次想了解有关用户的信息时都访问数据库。

class User
{
  string role;
  //.. other user attributes.
}

您的命令应该有所不同,因为您只需要有关一个用户的信息:

comm = new SqlCeCommand("Select * from [user] where user_id=1", conn);
于 2013-01-07T11:48:56.350 回答
0

我已经尝试通过在 Main_load 本身上放置一个中断来调试代码,但是当我运行它并登录时,它会完全忽略 Main_load 来显示主页。

这通常意味着您的方法Main_Load未绑定到表单的Load事件。检查您如何处理表单加载事件(如果您处理它)并解决问题。

希望这可以帮助。

于 2013-01-07T11:49:11.697 回答
0

我不明白这怎么可能抛出一个SqlException; 有两个原因:

  1. 您编写的 SQL 似乎不正确,并且

  2. 如果它是正确的,您似乎会期待多重结果(使用*),在这种情况下,使用while (reader.Read()) { ... }将遍历每个结果并相应地设置逻辑。因此,如果您拥有的第一个用户是USER第二个用户Administrator,则按钮启用状态将根据最后访问的值设置 - 而不是您想要的。

相反,设置一个静态实用程序类来帮助进行 SQL 查询。所以你会有一些像

public static calss Utilities
{
    public static bool SQLResult(SqlConnection conn, string strSQL)
    {
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = strSQL;
            strResult = cmd.ExecuteScalar().ToString();
        }
        catch (Exception e)
        {
            // Return error or display.
            return false;
        }
        return true;
    }
}

该方法将期望返回单个文本结果。

现在您要使用的 SQL 是

SELECT SYSTEM_USER;
GO

这将返回当前登录的用户;执行查询的用户。对我来说,它返回'ServerName\Administrator'。所以你的逻辑可能是

string sql = "SELECT SYSTEM_USER;";
string result = Utilities.SQLResult(someValidConnection, sql);
if (result.Contains("Administrator"))
    // Do stuff.

我希望这有帮助。

笔记。以上并未考虑 SQL 注入攻击或其他安全问题。对于大多数基本的 WinForm 应用程序(非基于 Web 的),这些安全问题是 IMO 不值得担心的。

于 2013-01-07T11:58:44.133 回答