2012-04-27 68 views
1

私はC#開発に新しく、単純なアプリケーションを作成しようとしているときに問題が発生しました。最初のComboBoxのSelectedIndexChangedプロパティに基づいてComboBoxを作成しようとしています。 Visual Studioは、2番目のcn.Open(プライベート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

+0

'SelectedIndexChanged'からopenコマンドを削除すると、何も撮られませんか?データベース接続が開いているように見えますか? –

+0

ConnectionPoolの作業を複製しようとしています。ですから@ cadrell0のアドバイスに従ってください:接続を各メソッドにローカルにしておきます。 –

答えて

2

コードを変更して、各メソッドで新しい接続を宣言し、usingステートメントでラップする必要があります。その後、自動的に閉じて処分されます。

関連する問題