1

当我从组合框中选择管理器并输入不正确的用户名和密码时,以下代码可以正常工作,错误“您无法添加或更改记录,因为表'权限'中需要相关记录”。如果我为访客输入不正确或正确的用户名和密码,则没有错误。如果我为 Manager 输入正确的用户名和密码,则没有错误。错误指向 cmd.ExecuteNonQuery();。请问有人可以帮我吗?

如果我删除 switch case Guest 的整个代码,从

        command.CommandText = "SELECT * FROM [GuestPrivileges] WHERE STRCOMP  

然后它就可以正常工作了。GuestPrivileges 表没有关系,它是独立的。

private void btnLogin_Click(object sender, EventArgs e)
    {
        string value = cBRoles.Text;

        switch (value)
        {
            case "Managers":
                using (var command = myCon.CreateCommand())
                {
                    command.CommandText = "SELECT * FROM [Privileges] WHERE STRCOMP(UserName, @UserName,0) = 0 AND STRCOMP(Password, @Password,0)=0";
                    command.Parameters.AddWithValue("UserName", (txtUsername.Text));
                    command.Parameters.AddWithValue("Password", (txtPassword.Text));

                    myCon.Open();
                    var reader = command.ExecuteReader();
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                txtUsername.Text = reader["UserName"].ToString();
                                txtPassword.Text = reader["Password"].ToString();
                                MainForm frm = new MainForm();
                                frm.Show();
                            }
                        }
                        else MessageBox.Show("You have entered incorrect credentials. Please try again", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                myCon.Close();

                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = "INSERT INTO LoginLogTable (UserName, LoggedInDate, LoggedInTime) VALUES (@UserName, @LoggedInDate, @LoggedInTime)";
                cmd.Parameters.AddWithValue("@UserName", txtUsername.Text);
                cmd.Parameters.AddWithValue("@LoggedInDate", DateTime.Now.ToShortDateString());
                cmd.Parameters.AddWithValue("@LoggedInTime", DateTime.Now.ToString("HH:mm"));
                cmd.Connection = myCon;
                myCon.Open();
                cmd.ExecuteNonQuery(); << error pointing here
                cmd.CommandText = "SELECT @@IDENTITY";
                int id = (int)cmd.ExecuteScalar();
                this.ID = id;
                myCon.Close();
                break;

                case "Guest":
                using (var command = myCon.CreateCommand())
                {
                    command.CommandText = "SELECT * FROM [GuestPrivileges] WHERE STRCOMP(GUserName, @GUserName,0) = 0 AND STRCOMP(GPassword, @GPassword,0)=0";
                    command.Parameters.AddWithValue("GUserName", (txtUsername.Text));
                    command.Parameters.AddWithValue("GPassword", (txtPassword.Text));

                    myCon.Open();
                    var reader = command.ExecuteReader();
                    {
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                txtUsername.Text = reader["GUserName"].ToString();
                                txtPassword.Text = reader["GPassword"].ToString();
                                ViewReport frmb = new ViewReport();
                                frmb.Show();
                            }
                        }
                        else MessageBox.Show("You have entered incorrect credentials. Please try again", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
               myCon.Close();
               break;
        }
    }

视觉工作室 2010、C#、MS 访问 2003

提前谢谢大家

4

1 回答 1

3

您显然在 [LoginLogTable] 和 [Privileges] 表之间定义了一个数据库关系,试图强制执行参照完整性。未知的经理在 [Privileges] 中没有匹配的行,因此当您尝试将他的(不存在的)用户名添加到 [LoginLogTable] 中时,数据库不会让您这样做。

如果您想记录来自未知经理的访问尝试,那么您应该为该关系禁用“强制参照完整性”。如果您不想记录这些尝试,则可以在 [Privileges] 表中进行查找,以查看 UserName 是否存在,然后再继续。如果用户名不存在,那么您可以让程序简单地终止(因为您已经告诉他们他们“输入了错误的凭据”)。

于 2013-06-04T12:14:15.057 回答