2012-08-25 4 views
3

결과 집합으로 여러 테이블을 반환하는 저장 프로 시저가 있습니다. 나는 그것을 DataTable에 저장하고 그 DataTable 객체를 다른 웹 페이지의 표를 인쇄하는 다른 양식에 전달합니다. 내 질문은 어떻게 하나의 DataTable 개체에 저장 프로 시저에서 반환 된 여러 ResultSet 저장할 수 있습니다. 다른 함수로 반환 할 수 있습니다. 어떻게 여기에서 각각의 DataTable을 얻을 수있는 세 가지 DataTablesSingle DataTable 개체의 저장 프로 시저에서 여러 결과 집합을 반환하십시오.

DataTable dtOutput = Generix.getGraphData(type); 

이동합니다

public static DataTable[] getGraphData(Int32 type) 
{ 
    SqlConnection oConn = null; 
    DataSet dsReturn = null; 
    DataTable[] dtReturn=new DataTable[2]; 
    try 
    { 
     getConnection(ref oConn, 1); 

     using (SqlStoredProcedure sspObj = new SqlStoredProcedure("dbo.usp_getGraphData", oConn, CommandType.StoredProcedure)) 
     { 
      sspObj.AddParameterWithValue("@Type", SqlDbType.Int, 0, ParameterDirection.Input, type); 
      dsReturn = sspObj.ExecuteDataSet(); 
      dtReturn[0] = dsReturn.Tables[0]; 
      dtReturn[1] = dsReturn.Tables[1]; 
      dtReturn[2] = dsReturn.Tables[2]; 
      sspObj.Dispose(); 
     } 
     closeConnection(ref oConn); 
    } 
    catch (Exception xObj) 
    { 
     //dtReturn[] = new DataTable(); 
    } 
    return dtReturn; 
} 

기능? 결과에 가입하여 저장 프로 시저에 현명한

답변

2

.

세 테이블 구조가 다르면 테이블에 넣는 것이 타당하지 않습니다. 이를 위해 DataSet이 더 좋습니다. 그것은 당신의 테이블을 모아 놓은 것입니다. 에 대한 질문에 대한

편집 DataTable의 [] :

DataTable[] dtOutputs = Generix.getGraphData(type); 
//dtReturn[0] 
DataTable dtOutput0 = dtOutputs[0]; 
//dtReturn[1] 
DataTable dtOutput1 = dtOutputs[1]; 
//dtReturn[2] 
DataTable dtOutput2 = dtOutputs[2]; 

아니면 만 테이블을 참조 할 필요는 없지만, 복사, 당신은 같은 .Copy()를 사용할 수 있습니다 :

//dtReturn[0] 
DataTable dtOutput1 = dtOutputs[1].Copy; 

나는 아직도 (그것은 그에서 DataTable에 쿼리를 만들기 위해 이해가되지 않습니다.) 가장 좋은 방법은 쿼리에 의해 데이터 집합을 반환 할 것이라고 생각

public static DataSet getGraphData(Int32 type) 
{ 
    SqlConnection oConn = null; 
    DataSet dsReturn = null; 
    try 
    { 
     getConnection(ref oConn, 1); 

     using (SqlStoredProcedure sspObj = new SqlStoredProcedure("dbo.usp_getGraphData", oConn, CommandType.StoredProcedure)) 
     { 
      sspObj.AddParameterWithValue("@Type", SqlDbType.Int, 0, ParameterDirection.Input, type); 
      dsReturn = sspObj.ExecuteDataSet(); 
      //You don't need Dispose() - because the using will do that on sspObj 
     } 

     closeConnection(ref oConn); 
    } 
    catch (Exception xObj) 
    { 
     dsReturn = new DataSet("Empty"); 
    } 
    return dsReturn ; 
} 

그리고 다음과 같은 메서드를 호출하십시오.

DataSet dsOutput = Generix.getGraphData(type); 

    //Simply a reference or Copy() the DataSet's tables: 
    DataTable dtOutput0 = dsOutput.Tables[0]; 
    DataTable dtOutput1 = dsOutput.Tables[1]; 
    DataTable dtOutput2 = dsOutput.Tables[2]; 
+0

편집을 진행합니다. 사용 된 데이터 집합 이제 배열로부터 각 DataTable을 추출하고 싶습니다. – Shaggy

+0

이어야합니다. DataTable [] dtOutputs = Generix.getGraphData (type); DataTable dtOutput1 = dtOutputs [0]; 또는 당신은 단지 참조하지만 같은 값을 갖는 새 데이터 테이블을 필요가없는 경우 다음 dtOutput [0] .Copy() 하지 이것이 당신이 다음 미안 찾고있는 경우,하지만 난 당신이 필요로하는 것을 이해하지 못하는 정확하게. –

+0

이 명령문은 dtReturn을 리턴합니까? 0,1,2 요소를 모두 반환합니다. – Shaggy

0

사용 노조처럼 dtOutput1에 0 번째 요소, dtOutput2에 첫번째 요소를 ..... 의미, 즉

함께 설정합니다

SELECT * from yourtable WHERE name='bob' 
UNION ALL 
SELECT * from yourtable WHERE name='jane' 

당신이 원하는 경우 여러 테이블을 단일 개체로 반환하려면 DataTable 대신 DataSet (여러 테이블 포함)을 사용할 수 있습니다. 당신은 같은 방식으로 그것을 채 웁니다.

예를 들면 : 당신이 언급 한 podiluska 같은 데이터 집합을 사용하고 하나에이 세 개의 테이블 하나를 얻는 DataSet.Tables 속성에 액세스하지 않는 이유는

DataSet dst = new DataSet(); 
new SqlAdapter(command).Fill (dst); 
+0

내 저장 프로 시저에 일치하는 열/데이터 형식이 없습니다. – Shaggy

+1

그러면 하나의 테이블을 어떻게 보이게할까요? – podiluska

+0

그것은 다른 열 및 DataType.I와 함께 여러 테이블의 3 개의 다른 DataTable로 반환하고 싶습니다. – Shaggy

관련 문제