2013-06-26 3 views
0

Ошибка показывает: 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; 
     } 
+1

'cmd.ExecuteScalar()' возвращает первый столбец первой строки, а не количество строк в наборе результатов. –

+1

Вы должны попробовать 'INSERT' и поймать исключение, когда уникальное ограничение на столбец имени пользователя будет нарушено (у вас есть * такое ограничение), не так ли?). В противном случае у вас может быть гонка, когда два пользователя пытаются зарегистрировать одно и то же имя пользователя - они оба выполняют «SELECT», не наблюдают никаких строк, а затем оба пытаются «INSERT» - вы можете также просто ввести код для 'INSERT' сбой и пропустить более ранний «ВЫБОР». –

+0

Как я могу получить исключение? –

ответ

1

Вам необходимо назначить соединение с командой в последнем примере

Таким образом в вашем заявлении с помощью добавления:

cmd.Connection = connection; 

Кроме того вам не нужно:

SqlCommand cmd; 

как команда создается в контексте этого оператора using.

Также считается хорошей практикой обернуть контекст Connection в операторе использования, чтобы убедиться, что фактическое соединение get установлено/закрыто правильно.

1

Попробуйте это,

using (SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")) 
{ 
    connection .Open(); 
    SqlCommand cmd = new SqlCommand("select * from [Users] where UserName = @UserName", connection); 
    cmd.Parameters.AddWithValue("UserName", tbUserName.Text); 
    bool exists = (int)cmd.ExecuteScalar() > 0; 
} 

Вы не указали connection к command. Во-вторых, вам нужно открыть соединение.

Обновление: Полный код

try 
{ 
    string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"; 
    bool exists = false; 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     connection .Open(); 
     SqlCommand cmd = new SqlCommand("select * from [Users] where UserName = @UserName", connection); 
     cmd.Parameters.AddWithValue("UserName", tbUserName.Text); 
     exists = (int)cmd.ExecuteScalar() > 0; 
    } 

    if (exists) 
    { 
     lblUserName.Text = "This username has been used by another user."; 
    } 
    else 
    { 
     using(SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlCommand 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)", 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); 

      cmd.ExecuteNonQuery(); 
     } 
    } 
} 
catch(Exception ex) 
{ 
    //Do something 
} 
finally 
{ 
    //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>'"); 
}   
+0

большое спасибо , Я понимаю это сейчас, и он работает. –

+0

, но вставка теперь не работает .. ссылка объекта установлена ​​в нуль –

0

команда SQL должна иметь перегрузку, которая принимает инициированное соединение

0

Используй SqlCommand конструктор, который принимает соединение в качестве второго аргумента. Затем вы должны открыть его перед выполнением команды и после этого закрыть ее.

using (SqlCommand cmd = new SqlCommand("select * from [Users] where UserName = @UserName", connection)) 
{ 
    cmd.Parameters.AddWithValue("UserName", tbUserName.Text); 

    connection.Open(); 

    exists = (int)cmd.ExecuteScalar() > 0; 

    connection.Close(); 
}