2016-07-17 4 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(選択== "追加")_これはどのようにこの状態から抜け出すでしょうか? – TaW

答えて

0

while (selected == "ADD")は決して終わらない無限ループです。私はあなたがするつもりだと思う:

if(selected == "ADD") 

サイドノートとして。これは、INSERTクエリであるので、私はあなたが必要な推測:

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

あなたのwhileループのための条件を変更していない - それは今まで本当ならば、それはを以下となります。代わりに

cmDB.ExecuteNoneQuery(); 

を常には本当である:

string selected = (string)cmbOperation.SelectedItem; 

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

あなたのコードと、他の重大な問題は、しかし、があります。

  • あなたはUIスレッドでデータベース操作を実行しています。これは、操作が完了するまでUIをハングします。非同期/待機および非同期のデータベース操作を使用する方が良い
  • コード化されたSQLを使用するのではなく、値からSQLを構築するため、コードにSQL injection attacksの脆弱性があります。 これを最初に修正してください。
  • 挿入操作を実行するには、ExecuteReaderを呼び出してください。代わりにExecuteNonQueryを使用してください。ExecuteReaderはクエリ用に設計されており、コードは何もクエリしていません。
  • 接続とコマンドにはusingステートメントを使用する必要があります。したがって、実行がusingステートメントのスコープから離れると自動的に閉じられます。現在、接続はファイナライズされ、ガベージコレクトされるまでハングアップします。これはハングアップする可能性があります。
関連する問題