2011-07-06 22 views
0

DataList binding: "接続が閉じられていません。接続の現在の状態は開いています。"私はSQLの表から選択されたデータとのDataListコントロールをバインドしようとしている

 private void ShowPossiblePurchases(string CategoryName) 
{ 

    string selectSQL = "SELECT TOP 2 * FROM Menu WHERE [email protected] ORDER BY NEWID()"; 
    SqlCommand cmd = new SqlCommand(selectSQL, connection); 
    cmd.Parameters.AddWithValue("@CategoryName", CategoryName); 
    SqlDataReader reader; 

    DataList DataList1 = (DataList)lgnView.FindControl("DataList1"); 

    try 
    { 

     connection.Open(); 
     reader = cmd.ExecuteReader(); 
     DataList1.DataSource = reader; 
     DataList1.DataBind(); 

     reader.Close(); 

    } 
    catch (Exception ex) 
    { 
     Label lblError = (Label)lgnView.FindControl("lblError"); 
     lblError.Text = ex.Message; 
    } 
    finally 
    { 
     connection.Close(); 
    } 

私はこのコードを実行すると、私が得る「接続が閉じられていなかった接続の現在の状態がオープンしています。」

private void ShowPossiblePurchases(string CategoryName) 

{

string selectSQL = "SELECT TOP 2 * FROM Menu WHERE [email protected] ORDER BY NEWID()"; 
SqlCommand cmd = new SqlCommand(selectSQL, connection); 
cmd.Parameters.AddWithValue("@CategoryName", CategoryName); 
SqlDataReader reader; 

DataSet myDataSet = new DataSet(); 
myDataSet.Tables.Add("Products"); 


myDataSet.Tables["Products"].Columns.Add("ProductID"); 
myDataSet.Tables["Products"].Columns.Add("CategoryID"); 
myDataSet.Tables["Products"].Columns.Add("ProductName"); 
myDataSet.Tables["Products"].Columns.Add("Price"); 

DataList DataList1 = (DataList)lgnView.FindControl("DataList1"); 

try 
{ 
    connection.Open(); 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 

     DataRow rowNew = myDataSet.Tables["Products"].NewRow(); 
     rowNew["ProductID"] = reader["ProductID"]; 
     rowNew["CategoryID"] = reader["CategoryID"]; 
     rowNew["ProductName"] = reader["ProductName"]; 
     rowNew["Price"] = reader["Price"]; 
     myDataSet.Tables["Products"].Rows.Add(rowNew); 
    } 

    DataList1.DataSource = myDataSet.Tables["Products"]; 
    DataList1.DataBind(); 
} 
catch(Exception ex) 
{ 
    Label lblError = (Label)lgnView.FindControl("lblError"); 
    lblError.Text = ex.Message; 
} 
finally 
{ 
    connection.Close(); 
} 

}

+0

を避けるために、結果を別のコレクションにコピーし、それをデータソースとして使用する必要があります。 – w69rdy

+0

接続にブレークポイントを設定します。開いてからステップを実行し、そのエラーが発生している場所を確認します。 – esastincy

+0

@ w69rdy:私は最初の投稿を編集しました(DataListコントロールをバインドするためにDataSetを使用した以前のバージョンのメソッドを読むこともできます)。そのバージョンでも、上記のエラーが発生していました。 – Adriano

答えて

0

場合は、チェックすることができまず閉じるに読者

+0

それは働いた!ありがとう! – Adriano

+0

しかし、なぜ私は定期的に 'finally'ブロック内の接続を閉じるときに、私はclose()メソッドを補足的に呼び出す必要があるのか​​わかりません。 – Adriano

+0

実際には関数の最後に "finally"が実行されるので、最後に接続を閉じた後に読者を書くことができます – SMK

0

より接続を試してみてください方法の

私の以前のバージョンでは、このました最初に接続が閉じられました:

If ((cmd.Connection.State And System.Data.ConnectionState.Open) _ 
     <> System.Data.ConnectionState.Open) Then 
    cmd.Connection.Open() 
End If 

のC#:

if (((cmd.Connection.State & System.Data.ConnectionState.Open) != System.Data.ConnectionState.Open)) { 
    cmd.Connection.Open(); 
} 
+0

これは基本的に私が今やっていることです。ありがとうございました! – Adriano

0

あなたが接続を宣言していますか?

あなたは、提供されたコードの外でそれを宣言しており、手前のどこかで接続を開いているようです。

は...あなたは、接続が開いているかどうかを確認するために簡単なチェックに置くことができ、それを2回開こうとすると、私はあなたが直接そのようなリーダーにバインドすることができるとは思わない

if (conn == null || conn.State == ConnectionState.Closed) 
       OpenDBConnection(); 
+0

接続オブジェクトは、上記のメソッドを含むような子クラスが継承できるSuperClassで宣言されています。 – Adriano

関連する問題