SQLGetData
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
SQLGetData 는 열 값을 바인딩하지 않고 결과 집합 데이터를 검색하는 데 사용됩니다. 동일한 열에서 SQLGetData를 연속적으로 호출하여 텍스트, ntext 또는 이미지 데이터 형식이 있는 열에서 대량의 데이터를 검색할 수 있습니다.
애플리케이션이 결과 집합 데이터를 인출하기 위해 변수를 바인딩해야 하는 요구 사항은 없습니다. SQLGetData를 사용하여 SQL Server Native Client ODBC 드라이버에서 모든 열의 데이터를 검색할 수 있습니다.
SQL Server Native Client ODBC 드라이버는 SQLGetData를 사용하여 임의 열 순서로 데이터를 검색하는 것을 지원하지 않습니다. SQLGetData로 처리된 모든 언바운드 열에는 결과 집합의 바인딩된 열보다 높은 열 서수가 있어야 합니다. 애플리케이션은 바인딩되지 않은 가장 낮은 서수 열 값에서 가장 높은 서수 열 값으로 데이터를 처리해야 합니다. 하위 서수로 번호가 매겨진 열에서 데이터를 검색하려고 시도하면 오류가 발생합니다. 애플리케이션에서 서버 커서를 사용하여 결과 집합 행을 보고하는 경우 애플리케이션은 현재 행을 다시 페치한 다음 열 값을 가져올 수 있습니다. 문이 기본 읽기 전용 정방향 전용 커서에서 실행되는 경우 문을 다시 실행하여 SQLGetData를 백업해야 합니다.
SQL Server Native Client ODBC 드라이버는 SQLGetData를 사용하여 검색된 텍스트, ntext 및 이미지 데이터의 길이를 정확하게 보고합니다. 애플리케이션은 StrLen_or_IndPtr 매개 변수 반환을 잘 사용하여 긴 데이터를 신속하게 검색할 수 있습니다.
참고 항목
큰 값 형식에 대해 StrLen_or_IndPtr 은 데이터 잘림이 발생할 경우 SQL_NO_TOTAL을 반환합니다.
향상된 날짜 및 시간 기능에 대한 SQLGetData 지원
날짜/시간 형식의 결과 열 값은 SQL에서 C로의 변환에 설명된 대로 변환됩니다.
자세한 내용은 날짜 및 시간 개선 사항(ODBC)을 참조하세요.
큰 CLR UDT에 대한 SQLGetData 지원
SQLGetData 는 큰 CLR UDT(사용자 정의 형식)를 지원합니다. 자세한 내용은 ODBC(큰 CLR 사용자 정의 형식)를 참조하세요.
예시
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.
}
}