SqlDataReader不工作,它会跳过检查用户名的部分
本文关键字:用户 检查 工作 SqlDataReader | 更新日期: 2023-09-27 18:11:14
我正在研究一个有1个客户端和1个服务器的项目。我还创建了一个类库,我把代码放在里面,然后在服务器和客户端将这个类库作为参考。因此,我通过创建类的对象从客户机调用方法。而且效果很好……直到现在!
在类库中,我有一个叫做Check()的方法,它检查用户名是否已经存在(当尝试注册时),以及其他一些东西。但问题是,从数据库中检查用户名的步骤被跳过了!!我不知道为什么,它没有告诉我为什么出错。出现的唯一错误是在尝试将相同的用户名插入数据库时出现的错误,因为跳过了这个步骤。
下面是类库代码:
bool busy = false;
bool empty = false;
bool notSame = false;
bool completed = false;
public void Check(string a1, string b2, string c3, string d4, string e5, string f6)
{
SqlConnection con = new SqlConnection(@"Data Source=TALY-PC;Initial Catalog=TicTacToe;Integrated Security=True");
SqlCommand cmd = new SqlCommand("SELECT * FROM tblUsers", con);
if (con.State.Equals(ConnectionState.Open))
{
return;
}
else
{
con.Open();
}
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (dr["Username"].ToString() == d4)
{
busy = true;
}
else if (a1 == "" || b2 == "" || c3 == "" || d4 == "" || e5 == "" || f6 == "")
{
empty = true;
}
else if (e5 != f6)
{
notSame = true;
return;
}
else
{
dr.Close();
SqlCommand cmd1 = new SqlCommand("INSERT INTO tblUsers (Name, LastName, email, Username, Password) VALUES ('" + a1 + "', '" + b2 + "', '" + c3 + "', '" + d4 + "', '" + e5 + "')", con);
cmd1.ExecuteNonQuery();
completed = true;
}
}
跳过的部分是这部分:
if (dr["Username"].ToString() == d4)
{
busy = true;
}
我不知道为什么它不检查这部分??
下面是来自客户端的代码:HttpChannel chan = new HttpChannel();
Tic obj = (Tic)Activator.GetObject(typeof(Tic), "http://127.0.0.1:9050/MyMathServer");
private void RegisterForm_Load(object sender, EventArgs e)
{
ChannelServices.RegisterChannel(chan);
}
private void Button1_Click(object sender, EventArgs e)
{
obj.Check(textBoxX1.Text, textBoxX2.Text, textBoxX3.Text, textBoxX4.Text, textBoxX5.Text, textBoxX6.Text);
label8.Text = obj.getUseri();
if (obj.getBusy() == true)
{
MessageBox.Show("This username is already Taken, please choose another username");
obj.setBusy();
}
else if (obj.getEmpty() == true)
{
MessageBox.Show("Please fill all the fields!");
obj.setEmpty();
}
else if (obj.getNotSame() == true)
{
MessageBox.Show("Passwords don't match!!");
textBoxX5.Text = "";
textBoxX6.Text = "";
obj.setNotSame();
}
else if (obj.getCompleted() == true)
{
MessageBox.Show("Registration was completed successfully. Please close the window and Log Int ");
textBoxX1.Text = "";
textBoxX2.Text = "";
textBoxX3.Text = "";
textBoxX4.Text = "";
textBoxX5.Text = "";
textBoxX6.Text = "";
obj.setCompleted();
}
}
谁能告诉我为什么不检查用户名?
我不太明白你的代码。我可以做一些简单的观察:
- 首先:使用连接和数据读取器的
using
。无论发生什么(异常等),using
都将关闭它们。 - 为变量使用更好的名称。
a1
到f6
都没有意义。给它们起个有意义的名字会让我们更容易读懂……所以…我真的不知道为什么e5一定等于f6。 - 同样的事情适用于你的文本框。
- 语句
if (a1 == "" || b2 == "" || c3 == "" || d4 == "" || e5 == "" || f6 == """)
在while循环内,但由于这些值永远不会改变,您可能会考虑将它们移出循环。 -
if (e5 != f6)
行也是如此。 - 检查连接是否打开。但这种联系刚刚建立起来。它怎么可能是开放的?如果门是开着的……它会什么都不做就返回吗?
- 如果您达到条件
(e5 != f6)
并且条件为真,则返回。但是您这样做没有关闭连接。 - 如果所有参数都是
""
,但数据库中没有记录,则不设置empty
。这是故意的吗?
试试这个代码:
public enum Result
{
Busy,
Empty,
NotSame,
Completed
}
public Result Check(string name, string lastName, string eMail, string userName, string password1, string password2)
{
// You should check with String.IsNullOrEmpty(...), not just an empty string.
if (name == "" || lastName == "" || eMail == "" || userName == "" || password1 == "" || password2 == "")
return Result.Empty;
if (password1 != password2)
return Result.NotSame;
using(SqlConnection con = new SqlConnection(@"Data Source=TALY-PC;Initial Catalog=TicTacToe;Integrated Security=True"))
{
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE UserName=@0", con);
cmd.Parameters.AddWithValue("@0", userName);
int count = (int)cmd.ExecuteScalar();
if (count > 0)
return Result.Busy;
// I must admit, also the insert values should be done with SqlParameters.
cmd = new SqlCommand("INSERT INTO tblUsers (Name, LastName, email, Username, Password) VALUES ('" + name + "', '" + lastName + "', '" + eMail + "', '" + userName + "', '" + password1 + "')", con);
cmd.ExecuteNonQuery();
return Result.Completed;
}
}