C# 表中的用户名重复
这是我用于注册信息的代码,我尝试了多种方法,将两个oleDbCommand添加到一起,但都不起作用,有没有办法在TryCatch代码中找到tbname.Text中的重复用户名?因此它不会插入数据库并显示错误消息C# 表中的用户名重复,c#,database,C#,Database,这是我用于注册信息的代码,我尝试了多种方法,将两个oleDbCommand添加到一起,但都不起作用,有没有办法在TryCatch代码中找到tbname.Text中的重复用户名?因此它不会插入数据库并显示错误消息 { { connect.Open(); OleDbCommand command = new OleDbCommand(); command.Conn
{
{
connect.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connect;
command.CommandText = "select * from Table1 where Username ='" + tbName.Text + "'";
OleDbDataReader reader = command.ExecuteReader();
int count = 0;
while (reader.Read())
{
count = count + 1;
//count++;
}
if (count == 0)
{
if (tbName.Text != "Name" && tbPass.Text != "Password")
{
if (tbEmail.Text != "Email" && tbMobile.Text != "Number")
{
if (tbFirstName.Text != "" && tbLastName.Text != "")
{
const int MIN_LENGTH = 8;
string password = tbPass.Text;
if (password.Length >= MIN_LENGTH && upperCase(password) >= 1)
{
r2.Text = "";
r2.ForeColor = Color.Red;
}
else
{
r2.Text = "*Password Is Bad*";
r2.ForeColor = Color.Red;
}
if (RegularExpression.checkForEmail(tbEmail.Text.ToString()))
{
r3.Text = "";
}
else
{
r3.Text = "Invalid email ! Email Contains a @ , .Com ";
r3.ForeColor = Color.Red;
}
if (r2.Text == "" && r3.Text == "")
{ goto na; }
else { goto ne; }
}
else { goto ne; }
}
else { goto ne; }
}
else { goto ne; ; }
ne:
if (tbName.Text == "Username")
{ r1.Text = "*USERNAME REQUIRED*"; r1.ForeColor = Color.Red; }
if (tbPass.Text == "Password")
{ r2.Text = "*PASSWORD REQUIRED*"; r2.ForeColor = Color.Red; }
if (tbEmail.Text == "Email")
{ r3.Text = "*EMAIL REQUIRED*"; r3.ForeColor = Color.Red; }
if (tbMobile.Text == "Number")
{ r4.Text = "*MOBILE NUMBER REQUIRED*"; r4.ForeColor = Color.Red; }
if (tbFirstName.Text == "")
{ label3.Text = "*FIRST NAME REQUIRED*"; r4.ForeColor = Color.Red; }
else { label3.Text = ""; }
if (tbLastName.Text == "")
{ label4.Text = "*LAST NAME REQUIRED*"; r4.ForeColor = Color.Red; }
else { label4.Text = ""; }
MessageBox.Show("Please fill up all the required information correctly before proceeding");
return;
na:
try
{
connect.Open();
OleDbCommand command1 = new OleDbCommand();
command1.Connection = connect;
command1.CommandText = "insert into Table1([Username], [Password], [Email], [Number], [FirstName], [LastName]) values('" + tbName.Text + "','" + tbPass.Text + "','" + tbEmail.Text + "','" + tbMobile.Text + "','" + tbFirstName.Text + "','" + tbLastName.Text + "')";
command1.ExecuteNonQuery();
MessageBox.Show("Data Saved");
MessageBox.Show("Successfully registered, Please log in");
regPage log = new regPage();
this.Hide();
log.ShowDialog();
this.Close();
connect.Close();
}
catch (Exception ex)
{
// MessageBox.Show("Error " + ex);
connect.Close();
}
}
// if (count > 1)
// {
// MessageBox.Show("Duplicate username and password");
// }
else
{
// MessageBox.Show("Username and password is incorrect");
MessageBox.Show("Duplicate Name , Please Use Other Username");
regPage log = new regPage();
this.Hide();
log.ShowDialog();
this.Close();
connect.Close();
}
connect.Close();
}
}
获取用户输入创建查询以统计具有此名称的用户:
Select count(*) from [User] Where UserName=@UserName
首先是@UserName
,这是一个参数,它通过command.Parameters.AddWithValue(“@UserName”,tbName.Text)
添加到命令中。这是保护代码不受攻击的必要条件
当您得到count查询的结果时:如果count>0=>显示错误消息并保留该方法,如果count==0,则继续执行插入查询
注意:
OleDbCommand和OdbCommand不支持命名参数,并使用?而不是占位符,因此参数的顺序很重要。但是,为了便于阅读,您可以为其参数命名,而不是使用?。
所以第二个命令中的参数应该正确,才能正常工作
connect.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connect;
command.CommandText = "insert into Table1([Username], [Password], [Email], [Number], [FirstName], [LastName]) values(@Param1,@Param2,'" + tbEmail.Text + "','" + tbMobile.Text + "','" + tbFirstName.Text + "','" + tbLastName.Text + "')";
command.ExecuteNonQuery();
command.Paramaters.AddWithValue(@Param1, yourValue);
command.Paramaters.AddWithValue(@Param2, yourValue);
and so on for other your parameters but with correct order
您可以使用其他名称,而不是@Param1等等。另外,请将您的表重命名为“表1”
另一件事是没有必要在尝试和捕捉中关闭您的连接。使用try-catch的正确方法是使用try/catch/finally
try
{
con.Open();
// stuff
}
catch
{
throw;
}
finally
{
//this will be executed always
con.Close();
}
另一个需要做的高级工作是在单独的类中进行数据访问。我想这是一个学校项目,但如果你想成为一名真正的程序员并想学习一些东西,你可以在这个问题中检查data access类是如何编写的:。答案是关于sql连接,但它是相同的
为了提高可读性,您可以改进的另一件事是不要以tb开头文本框,在名称的末尾指示控件。因为你的眼睛不会立刻看到正确的名字。所以当你有很多控件时,userNameTb比tbUserName好 获取用户输入创建一个查询以统计具有此名称的用户:
Select count(*) from [User] Where UserName=@UserName
首先是@UserName
,这是一个参数,它通过command.Parameters.AddWithValue(“@UserName”,tbName.Text)
添加到命令中。这是保护代码不受攻击的必要条件
当您得到count查询的结果时:如果count>0=>显示错误消息并保留该方法,如果count==0,则继续执行插入查询
注意:
OleDbCommand和OdbCommand不支持命名参数,并使用?而不是占位符,因此参数的顺序很重要。但是,为了便于阅读,您可以为其参数命名,而不是使用?。
所以第二个命令中的参数应该正确,才能正常工作
connect.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connect;
command.CommandText = "insert into Table1([Username], [Password], [Email], [Number], [FirstName], [LastName]) values(@Param1,@Param2,'" + tbEmail.Text + "','" + tbMobile.Text + "','" + tbFirstName.Text + "','" + tbLastName.Text + "')";
command.ExecuteNonQuery();
command.Paramaters.AddWithValue(@Param1, yourValue);
command.Paramaters.AddWithValue(@Param2, yourValue);
and so on for other your parameters but with correct order
您可以使用其他名称,而不是@Param1等等。另外,请将您的表重命名为“表1”
另一件事是没有必要在尝试和捕捉中关闭您的连接。使用try-catch的正确方法是使用try/catch/finally
try
{
con.Open();
// stuff
}
catch
{
throw;
}
finally
{
//this will be executed always
con.Close();
}
另一个需要做的高级工作是在单独的类中进行数据访问。我想这是一个学校项目,但如果你想成为一名真正的程序员并想学习一些东西,你可以在这个问题中检查data access类是如何编写的:。答案是关于sql连接,但它是相同的
为了提高可读性,您可以改进的另一件事是不要以tb开头文本框,在名称的末尾指示控件。因为你的眼睛不会立刻看到正确的名字。所以当你有很多控件时,userNameTb比tbUserName好 啊!sql注入漏洞。它烧了我们!只是用老派的方法@JoelCoehoorn@TeronKee试着理解我写的内容,如果有不清楚的地方,作为一个问题。如果计数大于0,你应该显示错误消息。计数等于1表示已存在具有此名称的用户。你没有解决你的其他问题,请不要使用goto,它会使你的代码更不可读,如果嵌套的也不好。如果你从我详细解释的所有问题中清除代码,你会发现问题非常简单。嘎!sql注入漏洞。它烧了我们!只是用老派的方法@JoelCoehoorn@TeronKee试着理解我写的内容,如果有不清楚的地方,作为一个问题。如果计数大于0,你应该显示错误消息。计数等于1表示已存在具有此名称的用户。你没有解决你的其他问题,请不要使用goto,它会使你的代码更不可读,如果嵌套的也不好。如果你从我详细解释的所有问题中清除代码,你会发现问题非常简单。我会在尝试另一种方法时更改代码。你能看到它有什么问题吗?它显示重复的用户名,它不会进入计数==1@mybirthname@TeronKee我在你的问题中写了评论。了解什么是调试,并正确使用它来查看发生了什么。因为我像注册信息一样保存在数据库中,我不能同时使用这两个连接,而且我不太理解您的格式,因为我在@MyBirthName中还是新手有两个OleDbConnection对象没有问题,不要使用全局OleDbConnection。有一种东西叫做连接池。就像我在评论中解释的那样,你没有检查count==0,你检查的是count==1,这是错误的。好吧,关于重复的用户名现在可以工作了,我可以用上面更改的代码问一下,为什么在它显示重复的用户名并且我更改了它之后,再次按下按钮,它将不再显示任何内容或工作@mybirthname谢谢!对不起,我对这一点很陌生,我正在学习我会在尝试另一种方法时更改代码,你能看到它有什么问题吗?它显示重复的用户名,它不会进入计数==1@mybirthname@TeronKee我在你的问题中写了评论。了解什么是调试并使用它