다음을 통해 공유


SQLGetData

SQLGetData는 열 값을 바인딩하지 않고 결과 집합 데이터를 검색하는 데 사용됩니다. 동일한 열에서 SQLGetData를 연속해서 호출하여 text, ntext 또는 image 데이터 형식 열에서 많은 양의 데이터를 검색할 수 있습니다.

응용 프로그램이 결과 집합 데이터를 인출하기 위해 변수를 바인딩해야 하는 요구 사항은 없습니다. SQLGetData를 사용하여 SQL Server Native Client ODBC 드라이버에서 모든 열의 데이터를 검색할 수 있습니다.

SQL Server Native Client ODBC 드라이버는 임의의 열 순서로 데이터를 검색하기 위한 SQLGetData 사용을 지원하지 않습니다. SQLGetData를 사용하여 처리된, 바인딩되지 않은 모든 열은 결과 집합의 바인딩된 열보다 높은 열 서수를 가져야 합니다. 응용 프로그램은 바인딩되지 않은 가장 낮은 서수 열 값에서 가장 높은 서수 열 값으로 데이터를 처리해야 합니다. 서수 번호가 더 낮은 열의 데이터를 검색하려고 하면 오류가 발생합니다. 응용 프로그램에서 서버 커서를 사용하여 결과 집합 행을 보고하는 경우 현재 행을 다시 인출한 다음 열 값을 인출할 수 있습니다. 읽기 전용, 정방향 전용 기본 커서에서 문이 실행된 경우 해당 문을 다시 실행하여 SQLGetData를 백업해야 합니다.

SQL Server Native Client ODBC 드라이버는 SQLGetData를 사용하여 검색된 text, ntextimage 데이터의 길이를 정확하게 보고합니다. 응용 프로그램은 StrLen_or_IndPtr 매개 변수 반환 값을 이용하여 긴 데이터를 신속하게 검색할 수 있습니다.

[!참고]

큰 값 형식에 대해 StrLen_or_IndPtr은 데이터 잘림이 발생할 경우 SQL_NO_TOTAL을 반환합니다.

향상된 날짜 및 시간 기능에 대한 SQLGetData 지원

날짜/시간 유형의 결과 열 값은 SQL에서 C로 변환에 설명된 대로 변환됩니다.

자세한 내용은 날짜/시간 기능 향상(ODBC)을 참조하십시오.

큰 CLR UDT에 대한 SQLGetData 지원

SQLGetData는 큰 CLR UDT(사용자 정의 형식)를 지원합니다. 자세한 내용은 큰 CLR 사용자 정의 형식(ODBC)을 참조하십시오.

SQLHDBC     hDbc = NULL;
SQLHSTMT    hStmt = NULL;
long        lEmpID;
PBYTE       pPicture;
SQLINTEGER  pIndicators[2];

// Get an environment, connection, and so on.
...

// Get a statement handle and execute a command.
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);

if (SQLExecDirect(hStmt,
    (SQLCHAR*) "SELECT EmployeeID, Photo FROM Employees",
    SQL_NTS) == SQL_ERROR)
    {
    // Handle error and return.
    }

// Retrieve data from row set.
SQLBindCol(hStmt, 1, SQL_C_LONG, (SQLPOINTER) &lEmpID, sizeof(long),
    &pIndicators[0]);

while (SQLFetch(hStmt) == SQL_SUCCESS)
    {
    cout << "EmployeeID: " << lEmpID << "\n";

    // Call SQLGetData to determine the amount of data that's waiting.
    if (SQLGetData(hStmt, 2, SQL_C_BINARY, pPicture, 0, &pIndicators[1])
        == SQL_SUCCESS_WITH_INFO)
        {
        cout << "Photo size: " pIndicators[1] << "\n\n";

        // Get all the data at once.
        pPicture = new BYTE[pIndicators[1]];
        if (SQLGetData(hStmt, 2, SQL_C_DEFAULT, pPicture,
            pIndicators[1], &pIndicators[1]) != SQL_SUCCESS)
            {
            // Handle error and continue.
            }

        delete [] pPicture;
        }
    else
        {
        // Handle error on attempt to get data length.
        }
    }