2012-04-27 224 views
1

我是新的C#開發,並嘗試創建一個簡單的應用程序,我遇到了一個問題。我想基於第一個ComboBox的SelectedIndexChanged屬性填充一個ComboBox。 Visual Studio在第二個cn.Open(在private void cboCities_SelectedIndexChanged)中聲明連接已經打開。但是,從我的代碼中我相信我已經關閉了它?我做錯了什麼?任何和所有的幫助是高度讚賞。謝謝!「連接已經打開(狀態=開)」

public partial class Form1 : Form 
{ 
    private SqlCeConnection cn = new SqlCeConnection(@"Data Source = \Program Files\ParkSurvey\ParkSurvey.sdf; Persist Security Info = False; Password = *"); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     cn.Open(); 
     SqlCeCommand command = cn.CreateCommand(); 
     command.CommandText = "SELECT Name FROM Cities ORDER BY Name ASC"; 
     SqlCeDataAdapter da = new SqlCeDataAdapter(command); 
     DataSet ds = new DataSet(); 
     da.Fill(ds); 
     cn.Close(); 
     cboCities.ValueMember = "CityId"; 
     cboCities.DisplayMember = "Name"; 
     cboCities.DataSource = ds.Tables[0]; 
     cboCities.SelectedIndex = -1; 

    } 

    private void cboCities_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (cboCities.SelectedIndex > -1) 
     { 
      cn.Open(); 
      string Cities = cboCities.SelectedValue.ToString(); 
      SqlCeCommand command = cn.CreateCommand(); 
      command.CommandText = "SELECT Name FROM Parks WHERE CityId ='" + Cities + "'"; 
      SqlCeDataAdapter da = new SqlCeDataAdapter(command); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      if (cn.State == ConnectionState.Open) 
      cn.Close(); 
      cboParks.ValueMember = "ParkId"; 
      cboParks.DisplayMember = "Name"; 
      cboParks.DataSource = ds.Tables[0]; 
      cboParks.SelectedIndex = -1; 

     } 
    } 

} 
+3

你應該改變你的代碼以聲明每個方法一個新的連接,並在using語句包裹。然後它會自動關閉並處理。 – cadrell0 2012-04-27 19:25:22

+0

如果您從「SelectedIndexChanged」中刪除打開的命令,它將不會拍攝任何內容?或者數據庫連接看起來像是打開的? – 2012-04-27 19:26:02

+0

您正在嘗試複製ConnectionPool的工作。所以遵循@ cadrell0的建議:保持每個方法的本地連接。 – 2012-04-27 19:36:15

回答

2

你應該改變你的代碼以聲明每個方法一個新的連接,並在using語句包裹。然後它會自動關閉並處理。

相關問題