Ошибка показывает: ExecuteScalar: свойство подключения не было инициализировано и существует = (int) cmd.ExecuteScalar()> 0;Проверьте, существует ли имя пользователя в SQLExpress
bool exists = false;
using (SqlCommand cmd = new SqlCommand("select * from [Users] where UserName = @UserName"))
{
cmd.Parameters.AddWithValue("UserName", tbUserName.Text);
exists = (int)cmd.ExecuteScalar() > 0;
}
if (exists)
{
lblUserName.Text = "This username has been used by another user.";
}
else
{
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True");
SqlCommand cmd;
cmd = new SqlCommand("INSERT INTO Users (UserID,FName, LName, PhoneNo, Address, Email, UserName, Password, Points, Role) VALUES (@UserID,@FName, @LName, @PhoneNo, @Address, @Email, @UserName, @Password, @Points, @Role)");
try
{
cmd.Connection = connection;
cmd.Parameters.AddWithValue("@UserID", UserID);
cmd.Parameters.AddWithValue("@FName", tbFName.Text);
cmd.Parameters.AddWithValue("@LName", tbLName.Text);
cmd.Parameters.AddWithValue("@PhoneNo", tbPhoneNo.Text);
cmd.Parameters.AddWithValue("@Address", tbAddress.Text);
cmd.Parameters.AddWithValue("@Email", tbEmail.Text);
cmd.Parameters.AddWithValue("@UserName", tbUserName.Text);
cmd.Parameters.AddWithValue("@Password", tbPassword.Text);
cmd.Parameters.AddWithValue("@Points", Points);
cmd.Parameters.AddWithValue("@Role", Role);
connection.Open();
cmd.ExecuteNonQuery();
}
finally
{
connection.Close();
//session
Session["UserName"] = tbUserName.Text;
Session["UserID"] = ("SELECT * FROM Users WHERE UserID = 'UserID'");
Session["Points"] = ("SELECT * FROM Users WHERE Points = 'Points'");
//pop out then redirect
ClientScript.RegisterStartupScript(this.GetType(), "Success", "<script type='text/javascript'>alert('Thank you or signing up with us!');window.location='Home.aspx';</script>'");
}
}
Каким должен быть правильный способ объявить соединение первым, потому что я пытался поставить его раньше, но у меня возникли проблемы с ЦМД.
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True");
SqlCommand cmd;
bool exists = false;
using (SqlCommand cmd = new SqlCommand("select * from [Users] where UserName = @UserName"))
{
cmd.Parameters.AddWithValue("UserName", tbUserName.Text);
exists = (int)cmd.ExecuteScalar() > 0;
}
'cmd.ExecuteScalar()' возвращает первый столбец первой строки, а не количество строк в наборе результатов. –
Вы должны попробовать 'INSERT' и поймать исключение, когда уникальное ограничение на столбец имени пользователя будет нарушено (у вас есть * такое ограничение), не так ли?). В противном случае у вас может быть гонка, когда два пользователя пытаются зарегистрировать одно и то же имя пользователя - они оба выполняют «SELECT», не наблюдают никаких строк, а затем оба пытаются «INSERT» - вы можете также просто ввести код для 'INSERT' сбой и пропустить более ранний «ВЫБОР». –
Как я могу получить исключение? –