C# 如何检查一个表中的用户名和另一个表中的medicalcenter是否正确,然后它将登录?
我有两张桌子叫医生和医疗中心。我将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”附近给出了错误的语法。这意味着代码的内行是错误的?请参见最后一张图片C# 如何检查一个表中的用户名和另一个表中的medicalcenter是否正确,然后它将登录?,c#,forms,login,combobox,C#,Forms,Login,Combobox,我有两张桌子叫医生和医疗中心。我将doctorID作为DOCTOR表中的主键,将mcID作为MEDICALCENTRE中的主键。我也创造了他们之间的关系。我已经用用户名和密码登录了。但现在我仍然需要一个额外的东西,即MedicalCenter表中存在的McCenter字段 McCenter将在一个组合框中。我已经将数据库中的数据输入到组合框中。如果dusername、dpassword或McCenter中的任何一个错误,它将不允许您登录。它必须是正确的dusername、dpassword和mc
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)