2010-11-18 6 views
1

SQL Server에 7 개의 결과 집합을 반환하는 저장 프로 시저가 있습니다. ASP.NET에서이 저장 프로 시저를 호출하고 ASP.NET 페이지에 7 개의 GridView를 결과로 채 웁니다. 데이터를 얻기 위해 SqlDataReader를 사용하고 있지만 GridView를 채우기 위해 C# 코드를 고민하고 있습니다.하나의 저장 프로 시저에서 많은 GridView 컨트롤을 채우는 방법?

나는 데이터를 얻을 수있는 DAL 클래스를 생성하고 내가 거기에이 방법이 : 내가 전화하려고 해요

private SqlDataReader MultipleResults(SqlCommand cmd) 
{ 
    SqlConnection con = new SqlConnection(_connectionString); 
    cmd.Connection = con; 

    con.Open(); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    con.Close(); 
    return dr; 

} 

을 :

public SqlDataReader CheckDataIntegrity() 
{ 
    SqlCommand cmd = new SqlCommand("cc.DataCheck"); 
    return MultipleResults(cmd); 
} 

도우미 메서드 수 MultipleResults 다음과 같습니다를 내 페이지의 구성 요소는 다음과 같습니다.

private void FillGridViews()   
{ 
    DBUtil DB = new DBUtil(); 
    using (SqlDataReader dr = DB.CheckDataIntegrity()) 
    { 
     if (dr.HasRows) 
     { 
      while (dr.Read()) 
      { 
       GridView1.DataSource = dr; 
       GridView1.DataBind(); 
      } 
     } 
    } 
} 

예를 들어 웹을 검색했습니다. 이,하지만 아무것도 찾을 수 없습니다.

리소스를 알고 있습니까? 아니면 공유 할 작은 예제가 있습니까?

감사합니다.

+0

multipleResults 메서드에서 SqlConnection을 using 문으로 묶어야합니다. – Lareau

+0

@Laraeu -이 점이 아무런 차이가 없었습니다. 독자가 닫힐 때 HasRows를 호출하려는 시도가 잘못되었습니다. " –

+0

답변의 설명에 문제가 있음을 확인했습니다. MultiResults의 매개 변수를 변경하여 sqlconnection을 허용하여 열기 및 닫기를 효율적으로 관리 할 수 ​​있습니다. – Lareau

답변

1

첫 번째 결과 집합에서 다음 결과 집합으로 진행하려면 DataReader의 .NextResult() method을 사용해야합니다. 더 많은 결과가 집합에 있으면 메서드는 True를 반환하고 더 이상 결과 집합이 없으면 False를 반환합니다.

.NextResult()를 호출 한 후 GridView를 현재 결과 집합에 바인딩 할 수 있습니다.

코드는 다음과 같습니다

SqlDataReader dr = DB.CheckDBIntegrity(); 

while (!dr.NextResult()) 
    { 
     // bind results to appropriate grid 
    } 
+0

필자의 질문에 내 코드를 업데이트 한 결과이 오류가 발생합니다 : '판독기가 닫힌 상태에서 HasRows를 호출하려는 시도가 잘못되었습니다.' –

+0

@Mark : 이것은 데이터 아더에서 데이터를 읽거나 사용하기 전에 데이터베이스에 대한 연결을 닫았 기 때문입니다. – Jazza

+0

MultipleResults 메서드에서 con.Close()를 제거했지만 동일한 오류가 발생합니다 : '판독기가 닫힐 때 HasRows 호출 시도가 유효하지 않습니다.' –

4

당신은 당신의있는 GridViews에 바인딩 할 여러 개의 테이블을 가질 수 있습니다 데이터 집합을 사용해야합니다.

var dataset = GetDataSetForMy7GridViews(); 

// also valid: dataset.Tables["TableName"]; 
GridView1.DataSource = dataset.Tables[0]; 
GridView1.DataBind(); 

GridView2.DataSource = dataset.Tables[1]; 
GridView2.DataBind(); 

GridView3.DataSource = dataset.Tables[2]; 
GridView3.DataBind(); 

GridView4.DataSource = dataset.Tables[3]; 
GridView4.DataBind(); 

GridView5.DataSource = dataset.Tables[4]; 
GridView5.DataBind(); 

GridView6.DataSource = dataset.Tables[5]; 
GridView6.DataBind(); 

GridView7.DataSource = dataset.Tables[6]; 
GridView7.DataBind(); 

7 개의 다른 GridView에 바인딩하므로이 방법으로 수행해야합니다. 코드에 따라 작업하는 경우 :

>    while (dr.Read()) 
>    { 
>     GridView1.DataSource = dr; 
>     GridView1.DataBind(); 
>    } 

오직 1 GridView에만 바인딩됩니다.

추가 : 아마도이 링크는 질문에 대한 답변입니까? http://www.codeguru.com/csharp/csharp/cs_network/database/article.php/c8715

+0

이것이 정확히 내 생각은 단순함이 가장 뛰어나고 +1을받습니다. 솔루션에 대한 – Dal

+0

감사합니다.SqlDataReader와 비교하여 성능이 낮기 때문에 Dataset에서 벗어나려고했습니다. 그러나 작동하도록 SqlDataReader 솔루션을 가져올 수 없으면 DataSet을 사용해야 할 수도 있습니다. 답장을 보내 주셔서 감사합니다. –

+0

마크, 내 대답에 대한 링크를 추가했습니다. 도움이 될만한지 확인해보십시오. – Arief

관련 문제