C# 如何检查一个表中的用户名和另一个表中的medicalcenter是否正确,然后它将登录?

C# 如何检查一个表中的用户名和另一个表中的medicalcenter是否正确,然后它将登录?,c#,forms,login,combobox,C#,Forms,Login,Combobox,我有两张桌子叫医生和医疗中心。我将doctorID作为DOCTOR表中的主键,将mcID作为MEDICALCENTRE中的主键。我也创造了他们之间的关系。我已经用用户名和密码登录了。但现在我仍然需要一个额外的东西,即MedicalCenter表中存在的McCenter字段 McCenter将在一个组合框中。我已经将数据库中的数据输入到组合框中。如果dusername、dpassword或McCenter中的任何一个错误,它将不允许您登录。它必须是正确的dusername、dpassword和mc

我有两张桌子叫医生和医疗中心。我将doctorID作为DOCTOR表中的主键,将mcID作为MEDICALCENTRE中的主键。我也创造了他们之间的关系。我已经用用户名和密码登录了。但现在我仍然需要一个额外的东西,即MedicalCenter表中存在的McCenter字段

McCenter将在一个组合框中。我已经将数据库中的数据输入到组合框中。如果dusername、dpassword或McCenter中的任何一个错误,它将不允许您登录。它必须是正确的dusername、dpassword和mcCentre,然后表单将允许您登录

所以我认为我需要做的是添加代码来检查dusername或McCenter字段是否正确。例如,如果我使用Jack和Tan Tock Seng以及正确的密码登录,它将允许我登录,但如果我使用Jack和Woodland以及正确的密码登录,登录将失败,因为Woodland McCenter中不存在Jack。我该怎么做

请参阅下面的图片和登录代码

这是我当前的代码。我像史蒂夫告诉我的那样去掉了钩子。现在,当点击登录按钮时,它在关键字“INNER”附近给出了错误的语法。这意味着代码的内行是错误的?请参见最后一张图片

void Fillcombo()
        {
            string strConnectionString = ConfigurationManager.ConnectionStrings["projectConnection"].ConnectionString;
            string Query = "select * from MEDICALCENTRE ;";
            SqlConnection conDataBase = new SqlConnection(strConnectionString);
            SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase);
            SqlDataReader myReader;


            try
            {

                conDataBase.Open();
                myReader = cmdDataBase.ExecuteReader();

                while (myReader.Read())
                {
                    string sName = myReader["mcCentre"].ToString();
                    comboBox1.Items.Add(sName);
                }
            }
            catch (Exception ex)
            {

            }


        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            //retrieve connection information info from App.config
            string strConnectionString = ConfigurationManager.ConnectionStrings["projectConnection"].ConnectionString;
            //STEP 1: Create connection
            SqlConnection myConnect = new SqlConnection(strConnectionString);
            //STEP 2: Create command
            string strCommandtext = "SELECT dUsername, dPassword from DOCTOR";
            // Add a WHERE Clause to SQL statement
            //strCommandtext += "   WHERE dUsername=@dname AND dPassword=@dpwd;";
            strCommandtext = " INNER JOIN MEDICALCENTRE ON DOCTOR.mcId = MEDICALCENTRE.mcId";
            // Add a WHERE Clause to SQL statement
            strCommandtext += "   WHERE dUsername=@dname AND dPassword=@dpwd AND mcCentre = @mcname;";            
            SqlCommand cmd = new SqlCommand(strCommandtext, myConnect);
            cmd.Parameters.AddWithValue("@dname", textUsername.Text);
            cmd.Parameters.AddWithValue("@dpwd", txtPassword.Text);
            cmd.Parameters.AddWithValue("@mcname", comboBox1.ToString());




            try
            {
                // STEP 3: open connection and retrieve data by calling ExecuteReader
                myConnect.Open();
                // STEP 4: Access Data
                SqlDataReader reader = cmd.ExecuteReader();


                while (reader.Read()) //For Doctor
                {
                    if (MessageBox.Show("Login Successful") == DialogResult.OK)
                    {
                        timer1.Enabled = true;
                        return;
                    }
                }



                //STEP 5: close connection
                reader.Close();
                MessageBox.Show("Invalid username or password");


            }

            finally
            {
                //STEP 5: close connection
                myConnect.Close();
            }
        }


        private void page_one_Load(object sender, EventArgs e)
        {
            pbLoading.Maximum = 100;
        }
1) 您应该在不同的帐户上使用不同的密码,否则您无法真正测试登录是否成功。使用test、123、test3等

2) 当您尝试将多个医生添加到一个诊所时,您会发现您的外键错误

3) 这是你的鱼:

string strCommandtext = "SELECT dUsername, dPassword from DOCTOR";
strCommandtext = " INNER JOIN MEDICALCENTRE ON DOCTOR.mcId = MEDICALCENTRE.mcId";
// Add a WHERE Clause to SQL statement
strCommandtext += "   WHERE dUsername=@dname AND dPassword=@dpwd AND mcCentre = @mcname;";

cmd.Parameters.AddWithValue("@mcname", comboBox.selectedItem.ToString());

在数据库结构中

select count(*) 
from MEDICALCENTRE 
WHERE mcID in (select mcID from DOCTOR where dUsername = @dname AND dPassword = @dpwd) 
我认为如果登录成功,这个查询将返回count>1


但是如果每个医生只有一个医疗中心,那么我认为您只需要一个表。

您的案例中的NullReferenceException(如最后一幅图所示)是由combobox1.SelectedItem.ToString()转换引起的

在您的监视窗口中,部分可见combobox1.SelectedItem为null,因此对null值调用ToString()方法会导致NullReferenceException

您可以使用此组合框的Text属性来解决此问题,使用

cmd.Parameters.AddWithValue("@mcname", combobox1.Text)

我认为这是因为您有一个带有
Style=DropDown
的组合框。通过这种方式,用户可以键入医疗中心的名称,但这不会产生SelectedItem属性集。

从您的数据库设计来看,医生似乎只能与一个医疗中心关联-在这种情况下,为什么要提供下拉列表?为什么不在登录后查一下呢?我和@Damien_这个异教徒在一起。永远不要让你的用户选择他们实际上没有的地方。@Damien-hmm我会考虑的。谢谢你的第二点错了。如果我们说:医生在一个而且只有一个医疗中心工作,这种关系是正确的。一个医疗中心有一个或多个医生在那里工作。在本例中,FK(与现在一样)位于MEDICALCENTER id的医生表上。如果我们说:一名医生在零个或多个MEDICALCENTER工作,则情况有所不同。在这种情况下,我们有一个多对多表,需要一个新表。@Alexander感谢您的快速回复。哦,我的外键错了,是吗,我会在解决这个问题后再解决它。我用你的编辑代码。当我没有键入任何内容时单击“登录”按钮时,我出现了与所附图像类似的错误。如果我选择medicalcenter并单击“登录”按钮,则在输出框中出现此错误(System.Data.SqlClient.SqlException类型的首次意外异常发生在System.Data.dll中)。@Steve:如果我错了,请更正我,但在我看来,第二个图像类似于“DOCTOR.doctorID是外键”,它应该在哪里“DOCTOR.mcID是外键”。是的,我想是的,可能是太多截图了。如果您引用的是NullReferenceException,那么将行更改为
cmd.Parameters.AddWithValue(“@mcname”,combobox1.Text)
我喜欢子查询方法,但它是错误的
(从DOCTOR中选择mcID…)
。此外,如果医疗中心中有许多医生,则向医疗中心表中添加医生ID的建议将毫无帮助。在这种情况下,需要一个新表来容纳多对多医生relationship@Steve是的,你是对的,如果医疗中心有许多医生,则需要一个新表。编辑了我的答案。谢谢。错误是gone,但我仍然无法登录,无论我是否提供了错误的详细信息或正确的详细信息,当我单击“登录”按钮时,它在输出框中给出了这一信息。System.Data.SqlClient.SqlException类型的第一次异常出现在System.Data.dll中。请参见第四幅图。Alexander先生给我的代码是否错误?对于cod的内部连接行e、 @Stevel你能在btnLogin_Click事件中用你的代码的实际转储替换该图像及其微小文本吗?你知道吗?但我们(老年人)对此已经没有眼光了。代码似乎是正确的。你能找到有关异常的更多详细信息吗?(StackTrace,details…)Visual Studio消息中的etc,带有异常。我还建议删除btnLogin_Click事件中的空catch子句。此catch在引发异常时有效隐藏异常。例如,假设您在打开连接时遇到问题。该catch隐藏异常,并最终在未打开的连接上调用close在…
strCommandtext=“在DOCTOR.mcId=MEDICALCENTRE.mcId上内部加入医疗中心”;
应该是
strCommandtext+=“…
,我说的眼睛不好是什么意思?
cmd.Parameters.AddWithValue("@mcname", combobox1.Text)