2015-01-01 3 views
1

Этот скрипт находится на странице регистрации моего визуального базового приложения. Сценарий сохраняет данные в базе данных без ошибок только тогда, когда я закрываю приложение, он дает мне ошибку, недействительную попытку прочитать, когда читатель закрыт. Это происходит только на этой страницеНеверная попытка прочитать, когда читатель закрыт. C# Mysql

if (PasswordRegister.Text == RepeatPasswordRegister.Text) 
     { 

      if (PasswordRegister.Text == "") 
      { 
       MessageBox.Show("Enter a vailed password"); 
      } 
      else if (UsernameRegister.Text == "") 
      { 
       MessageBox.Show("Enter a vailed Username"); 
      } 
      else { 

      string myConnection = "datasource=127.0.0.1;port=3306;username=root;password=Root;"; 
      MySqlConnection myConn = new MySqlConnection(myConnection); 

      MySqlCommand Login = new MySqlCommand("select * from database.users where Username='" + this.UsernameRegister.Text + "' ;", myConn); 

      MySqlDataReader RegisterReader; 
      myConn.Open(); 
      RegisterReader = Login.ExecuteReader(); 
      int count = 0; 
      while (RegisterReader.Read()) 
      { 
       count = count + 1; 
      } 
      if (count == 1) 
      { 
       MessageBox.Show("Username is taken"); 
      } 
      else if (count > 1) 
      { 
       MessageBox.Show("ERROR Contact support"); 
      } 
      else { 


        string constring = "datasource=127.0.0.1;port=3306;username=root;password=Root;"; 
        string Query = "insert into database.users (Username, Password) values ('" + this.UsernameRegister.Text + "','" + this.PasswordRegister.Text + "') ;"; 
        MySqlConnection conDataBase = new MySqlConnection(constring); 
        MySqlCommand cmdDataBase = new MySqlCommand(Query, conDataBase); 
        MySqlDataReader myReader; 
        try 
        { 
         conDataBase.Open(); 
         myReader = cmdDataBase.ExecuteReader(); 
         MessageBox.Show("Register Succes"); 
         conDataBase.Close(); 
         conDataBase.Dispose(); 
         this.Hide(); 
         Form1 home = new Form1(); 
         home.ShowDialog(); 
         while (myReader.Read()) 
         { 

         } 
        } 


        catch (Exception ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 

       } 
      myConn.Close(); 
     } 
     } 
     else { 
      MessageBox.Show("Check password"); 
     }; 
+2

Перед закрытием вы закрываете соединение с помощью считывателя. – PetSerAl

ответ

0

Если вы посмотрите на код внимательно, вы заметите, что вы закрыли соединение, прежде чем попытаться прочитать от читателя:

conDataBase.Open(); 
myReader = cmdDataBase.ExecuteReader(); 
conDataBase.Close(); *** Connection closed here 
conDataBase.Dispose(); *** And disposed disposed, for good measure 
... 
while (myReader.Read()) *** Now you are trying to Read! 
{ 

} 

Что вы необходимо сохранить соединение Open, пока вы не закончите чтение, например

using (var myConn = new MySqlConnection(myConnection)) 
using (var Login = new MySqlCommand("select * from database.users where Username= @myUserName", 
     myConn); 
{ 
    cmdDataBase.AddWithValue(new MySqlParameter("@myUserName", this.UsernameRegister.Text)); 
    conDataBase.Open(); 
    using (var myReader = cmdDataBase.ExecuteReader()) 
    { 
     while (myReader.Read()) 
     { 
      // Do something with myReader[] fields here 
     } 
    } // Reader disposed 
} // Command Disposed, Connection Closed + Disposed 

Я также предпочитаю using синтаксис для управления, таких как одноразовые соединения, команда и читатели, и в то же время, параметризации ваших запросов и команды - это имеет безопасность, и, возможно, также выигрыш в производительности.

Смежные вопросы