2017-03-26 5 views
0

ストレートポイント:私は何か助けが必要です。私はこのプログラムをAzureバックエンドで作っています。テーブルからデータを読み取り、それを変数に追加するリーダースクリプトがあります。初めてうまく動作します。Visual Studio、C#、Azure SQLデータベースに関する問題

"未処理の例外" System.InvalidOperationExceptionが発生しました "というメッセージが表示されたときに、ボタンを押してもう一度読み上げを取得すると、 System.Data.dll内

追加情報:ConnectionStringプロパティは が初期化されていません。ここでの変数のいくつかは、関数の外で宣言されている

private void TransactionGetButton_Click(object sender, EventArgs e) 
{ 
    string getterQuery = "SELECT balance FROM cloudbase WHERE name = '" + NameTextBox.Text + "' AND surname = '" + SurnameTextBox.Text + "';"; 
    SqlCommand getCommand = new SqlCommand(getterQuery, cloudDatabaseConnection); 
    try 
    { 
     cloudDatabaseConnection.Open(); 
     using (cloudDatabaseConnection) 
     { 
      SqlDataReader reader = getCommand.ExecuteReader(); 
      while (reader.Read()) 
      { 
       currentBalance = reader.GetInt32(0); 
      } 
      reader.Close(); 
      string currentBalanceToString = currentBalance.ToString(); 
      BalanceLabel.Text = currentBalanceToString + "MKD"; 
     } 
    }catch(SqlException e1) 
    { 
     Console.WriteLine(e1.StackTrace + "\n\n" + e1.Message); 
    } 
    cloudDatabaseConnection.Close();  
} 

はここで読者のためのコードです。 これはどういう意味ですか?私は接続を開いたり閉じたりして、正しく読み書きをします。道に迷いました。

いくつかの匹敵するコードを用意するには、接続を開いたり閉じたりする別のボタンがありますが、何回押しても機能します。どちらのスニペットも同じファイルのものですが、機能は次のとおりです。

private void AddButton_Click(object sender, EventArgs e) 
    { 
     amountToInt = int.Parse(AmountTextBox.Text); 
     insertdatabaseCloud.Connection = cloudDatabaseConnection; 
     insertdatabaseCloud.CommandText = "UPDATE cloudbase SET balance = balance + " + amountToInt + " WHERE name = '" + NameTextBox.Text +"' AND surname = '" + SurnameTextBox.Text +"';"; 
     if(AmountTextBox.Text == "") 
     { 
      MessageBox.Show("Please fill out all fields"); 
     } 
     else if(NameTextBox.Text == "") 
     { 
      MessageBox.Show("Please fill out all fields"); 
     } 
     else if(SurnameTextBox.Text == "") 
     { 
      MessageBox.Show("Please fill out all fields"); 
     } 
     else 
     { 
      cloudDatabaseConnection.Open(); 
      int i = insertdatabaseCloud.ExecuteNonQuery(); 
      cloudDatabaseConnection.Close(); 
      if (i != 0) 
      { 
       MessageBox.Show("Database data updated successfully!"); 
      } 
      else 
      { 
       MessageBox.Show("Something went wrong!"); 
      } 
     } 
    } 

ありがとうございます!

+0

一見すると、クラス内で同じ接続を共有しているように見えますが、問題を引き起こしている方法で共有されています。私はあなたが周りにそれを共有するのではなく、接続文字列から各メソッド(ステートメントを使用してそれらをラップするように注意している)で新しい接続を作成することをお勧めします。 –

+0

それでは、関数のために同じ接続を複数回作成する必要があると言っていますか?試してみましょう、迅速な返信のおかげで! @MartinCostello – user266716

+0

@MartinCostelloが正しかった!私は機能の中でそれを分割し、完璧に動作します!巨大な彼に感謝! – user266716

答えて

1

ここでは、SqlConnectionを複数の操作に再利用しています。これは安全ではないため、操作がお互いに行き渡り、発生している問題が発生します。

ストアあなたのクラスのフィールド/プロパティにstringとして接続文字列、および作成新しいSqlConnectionあなたのメソッドの各呼び出し内の接続文字列を使用して(あなたは接続をリークしないようにusingブロック中)(S )。

これは、ボタンを何回クリックしても操作を互いに分離するはずです(ただし、クエリの効果によってはSQL Server自体の中で重複する場合があります)。

関連する問題