C# Windows窗体登录
当我使用以下代码时,如果用户名和密码相同,则可以正常工作;如果我提供了错误的用户名和密码,则是nether向我发送消息或登录:C# Windows窗体登录,c#,windows,forms,C#,Windows,Forms,当我使用以下代码时,如果用户名和密码相同,则可以正常工作;如果我提供了错误的用户名和密码,则是nether向我发送消息或登录: private void btnSubmit_Click(object sender, EventArgs e) { try { SqlConnection con = Helper.getconnection(); con.Open();
private void btnSubmit_Click(object sender, EventArgs e)
{
try
{
SqlConnection con = Helper.getconnection();
con.Open();
SqlCommand cmd = new SqlCommand("select SupportName, Password from Logins where SupportName='" + txtSupportName.Text + "' and Password='" + txtPassword.Text + "'", con);
SqlDataReader dr = cmd.ExecuteReader();
string Name = txtSupportName.Text;
string Pwd = txtPassword.Text;
while (dr.Read())
{
if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
{
// MessageBox.Show("welcome");
Form Support = new Support();
Support.ShowDialog();
}
else
{
MessageBox.Show("SupportName and password are invalid");
}
}
dr.Close();
con.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
if (txtSupportName.Text == string.Empty)
{
MessageBox.Show("Please enter a value to Support Name!");
txtSupportName.Focus();
return;
}
if (txtPassword.Text == string.Empty)
{
MessageBox.Show("Please enter a value to Description!");
txtPassword.Focus();
return;
}
}
您的代码似乎存在一些问题:
dr.HasRows
以查看详细信息是否正确,或者检查dr.Read()
是否返回true以确定是否显示消息框和块处置数据库对象。例如(不确定为什么格式化不起作用):
使用(SqlConnection con=Helper.getconnection())
{
...
}
而不是显式调用
Dispose
和Close
。即使您确实想显式地调用Dispose
和Close
,您也应该在finally
块中这样做。代码中存在问题。您忘记检查数据读取器是否有行
if (dr.HasRows)
{
while (dr.Read())
{
if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
{
// MessageBox.Show("welcome");
Form Support = new Support();
Support.ShowDialog();
}
else
{
MessageBox.Show("SupportName and password are invalid");
}
}
}
else
{
MessageBox.Show("SupportName and password are invalid");
}
只需添加
HasRows
,检查您的表中是否存在用户名和密码,即可检索数据库中的数据
if(dr.HasRows)
{
//username and password exists
while (dr.Read())
{
if ((dr["SupportName"].ToString() == Name) && (dr["Password"].ToString() == Pwd))
{
// MessageBox.Show("welcome");
Form Support = new Support();
Support.ShowDialog();
}
}
}
else
{
//username and password not exists
MessageBox.Show("SupportName and password are invalid");
}
致以最良好的祝愿丹尼尔·凯利写了一个很好的答案,我只是实施了它,并添加了单独的方法来划分责任
private bool Login(string supportName, string password)
{
if(string.IsNullOrEmpty(supportName) || string.IsNullOrEmpty(password))
{
throw new ArgumentException();
}
using(var connection = Helper.getconnection())
using(var command = connection.CreateCommand())
{
conmmand.CommandText = "SELECT 1 FROM Logins WHERE SupportName=@SupportName AND Password=@Password";
command.Parameters.AddWithValue("@SupportName", supportName);
command.Parameters.AddWithValue("@Password", password);
return command.ExecuteScalar() != null;
}
}
private void ShowSupportForm()
{
var supportName = txtSupportName.Text;
var password = txtPassword.Text;
if (string.IsNullOrEmpty(supportName))
{
MessageBox.Show("Please enter a value to Support Name!");
txtSupportName.Focus();
return;
}
if (string.IsNullOrEmpty(password))
{
MessageBox.Show("Please enter a value to Passwod!");
txtPassword.Focus();
return;
}
if(Login(supportName, password))
{
using(var form = new Support())
{
form.ShowDialog(this);
}
}
else
{
MessageBox.Show("SupportName and password are invalid");
}
}
private void btnSubmit_Click(object sender, EventArgs e)
{
ShowSupportForm();
}
您是否尝试过单步执行代码?如果是这样,会发生什么。如果没有,为什么没有?while循环正在执行?如果您在查询中检查用户名和密码,那么在while循环中再次检查它有什么意义?如果不正确,您会得到任何行吗?仅供参考,您的代码不受保护!使用参数化查询防止SQL注入。在while循环中放置断点并观察发生了什么??查看是否滑到其他部分..检查变量状态..如果我输入了错误的用户名和密码,我希望它显示消息“SupportName和密码无效”,但在这里什么都没有发生,即使我输入了错误的详细信息,它也是空闲的。缺少指向的链接!是的,我将使用您提供的代码,所有您帮助我使用代码的工作,我将永远感谢您。