2016-07-17 5 views
0

моя цель - сделать мою кнопку гибкой в ​​зависимости от того, что в настоящее время является значением моего поля со списком, но проблема в том, что я запускаю свою программу на этом конкретном событии, которое она замерзает, что-то не так с моим синтаксисом, или мой компьютер просто медленный?Почему он замерзает?

private void cmbOperation_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string selected = (string)cmbOperation.SelectedItem; 

    while (selected == "ADD") 
    { 
     txtID.ReadOnly = true; 
     txtLName.ReadOnly = false; 
     txtFName.ReadOnly = false; 
     txtMI.ReadOnly = false; 
     txtGender.ReadOnly = false; 
     txtAge.ReadOnly = false; 
     txtContact.ReadOnly = false; 

     btnOperate.Text = "ADD CLIENT"; 
    } 
} 
private void btnOperation_Clicked(object sender, EventArgs e) 
{    
    if (cmbOperation.SelectedItem.Equals("ADD")) 
    { 
     string constring = "datasource=localhost;port3306;username=root"; 
     string Query = "insert into mybusiness.client_list (LastName,FirstName,MI,Gender,Age,Contact) values('" + this.txtLName.Text + "','" + this.txtFName.Text + "','" + this.txtMI.Text + "','" + this.txtGender.Text + "','" + this.txtAge.Text + "','" + txtContact.Text + "' ;"; 
     MySqlConnection conDB = new MySqlConnection(constring); 
     MySqlCommand cmDB = new MySqlCommand(Query, conDB); 
     MySqlDataReader myReader; 

     try 
     { 
      conDB.Open(); 
      myReader = cmDB.ExecuteReader(); 
       MessageBox.Show("Client Information has been added to the list"); 
      while(myReader.Read()) 
      { 
      } 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     }   
    } 
} 
+1

_while (selected == "ADD") _ И как это когда-либо выйдет из этого состояния ??? – TaW

ответ

0

while (selected == "ADD") - бесконечный цикл, который никогда не заканчивается. Я думаю, вы хотели:

if(selected == "ADD") 

В качестве примечания стороны. Так как это запрос вставки, я думаю, что вам нужно:

cmDB.ExecuteNoneQuery(); 

вместо:

myReader = cmDB.ExecuteReader(); 
MessageBox.Show("Client Information has been added to the list"); 
while(myReader.Read()) 
{ 
} 
6

Вы не изменяя условия для while цикла - так что если это когда-нибудь правда, это будет всегда быть правдой:

string selected = (string)cmbOperation.SelectedItem; 

while (selected == "ADD") 
{ 
    // Code that doesn't change the value of selected 
} 

Есть другие существенные проблемы с вашим кодом, однако:

  • Выполнение операций с базой данных в потоке пользовательского интерфейса. Это приведет к зависанию пользовательского интерфейса, пока операция не завершится. Было бы лучше использовать операции async/await и асинхронной базы данных
  • Ваш код уязвим для SQL injection attacks, потому что вы строите SQL из значений вместо использования параметризованного SQL. Исправить это первым.
  • Вы вызываете ExecuteReader для выполнения операции вставки. Вместо этого используйте ExecuteNonQuery - ExecuteReader предназначен для запросов, и ваш код ничего не запрашивает.
  • Вы должны использовать операторы using для соединения и команды, поэтому они автоматически закрываются, когда выполнение выходит из области действия оператора using - в настоящее время ваше соединение будет зависать до момента его завершения и сбора мусора; это может привести к зависанию.
Смежные вопросы