데이터 페치
데이터 소스, 세션 및 행 집합 개체를 연 후에는 데이터를 페치할 수 있습니다.사용하는 접근자의 형식에 따라 열을 바인딩해야 하는 경우도 있습니다.
데이터를 페치하려면
알맞은 Open 명령을 사용하여 행 집합을 엽니다.
CManualAccessor를 사용하고 있으면, 아직 출력 열을 바인딩하지 않은 경우 출력 열을 바인딩합니다.열을 바인딩하려면 다음 예제와 같이 GetColumnInfo를 호출한 다음 바인딩을 가진 접근자를 만듭니다.
// From the DBViewer Sample CDBTreeView::OnQueryEdit // Get the column information ULONG ulColumns = 0; DBCOLUMNINFO* pColumnInfo = NULL; LPOLESTR pStrings = NULL; if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK) ThrowMyOLEDBException(rs.m_pRowset, IID_IColumnsInfo); struct MYBIND* pBind = new MYBIND[ulColumns]; rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns); for (ULONG l=0; l<ulColumns; l++) rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus); rs.Bind();
while 루프를 작성하여 데이터를 검색합니다.다음 예제에서처럼 루프에서 MoveNext를 호출하여 커서를 다음으로 이동하고 S_OK에 대한 반환 값을 검사합니다.
while (rs.MoveNext() == S_OK) { // Add code to fetch data here // If you are not using an auto accessor, call rs.GetData() }
while 루프 내에서 접근자 형식에 따라 데이터를 페치할 수 있습니다.
CAccessor 클래스를 사용하는 경우, 데이터 멤버가 들어 있는 사용자 레코드가 있어야 합니다.다음 예제와 같이 이들 데이터 멤버를 사용하여 데이터에 액세스할 수 있습니다.
while (rs.MoveNext() == S_OK) { // Use the data members directly. In this case, m_nFooID // is declared in a user record that derives from // CAccessor wsprintf_s("%d", rs.m_nFooID); }
CDynamicAccessor 또는 CDynamicParameterAccessor 클래스를 사용하는 경우, 다음 예제에서처럼 GetValue 및 GetColumn 액세스 함수를 사용하여 데이터를 페치할 수 있습니다.사용하고 있는 데이터 형식을 확인하려는 경우에는 GetType을 사용하십시오.
while (rs.MoveNext() == S_OK) { // Use the dynamic accessor functions to retrieve your data. ULONG ulColumns = rs.GetColumnCount(); for (ULONG i=0; i<ulColumns; i++) { rs.GetValue(i); } }
CManualAccessor를 사용하는 경우 다음 예제와 같이 사용자 고유의 데이터 멤버를 지정하여 바인딩한 후 직접 액세스해야 합니다.
while (rs.MoveNext() == S_OK) { // Use the data members you specified in the calls to // AddBindEntry. wsprintf_s("%s", szFoo); }