2017-03-26 81 views
0

單刀直入:我一定幫助迫切需要。我正在使用Azure後端製作此程序,並且我有一個閱讀器腳本,用於從表中讀取數據並將其添加到變量中。它工作正常,第一次。如果我按下按鈕來獲得一個讀第二遍,甚至任何按鈕,我已經按下Get按鈕後,我得到一個崩潰說:問題與Visual Studio,C#和SQL Azure的數據庫

「‘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本身內部重疊,具體取決於您的查詢的效果),這應該將操作與對方隔離。