2011-07-06 3 views
0

는 내가 SQL 테이블에서 선택된 데이터 바인딩 DataList 컨트롤을 시도하고있다 ".. 연결이 연결의 현재 상태가 열려 닫히지 않았습니다"나는이 코드를 실행하면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

실제로 마지막으로 함수가 끝날 때까지 실행하여 연결 닫기 후에 독자를 가까이에서 작성할 수 있습니다. – 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

당신이 연결을 선포?

제공된 코드 외부에서 선언하고 다른 곳에서 연결을 여는 것처럼 보입니다.

은 ... 당신이 연결이 열려 있는지 확인하기 위해 간단한 검사에 넣을 수 있습니다, 두 번 열려고 내가 직접 그런 독자에 바인딩 할 수 있다고 생각하지 않습니다

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

연결 개체는 위의 메서드가 포함 된 자식 클래스처럼 상속받을 수있는 SuperClass에서 선언됩니다. – Adriano

관련 문제