SQLGetData
SQLGetData é usado para recuperar dados de conjunto de resultados sem valores de coluna de associação. SQLGetData pode ser chamado sucessivamente na mesma coluna para recuperar grandes quantidades de dados em uma coluna com um tipo de dados text, ntext ou image.
Não há nenhum requisito de que aplicativo associe variáveis para buscar dados de conjunto de resultados. Os dados de qualquer coluna podem ser recuperados no driver ODBC do SQL Server Native Client usando SQLGetData.
O driver ODBC do SQL Server Native Client não oferece suporte ao uso de SQLGetData para recuperar dados em ordem de coluna aleatória. Todas as colunas desassociadas processadas com SQLGetData devem ter ordinais de coluna mais altos que as colunas associadas no conjunto de resultados. O aplicativo deve processar dados do valor de coluna ordinal mais baixo desassociado para o mais alto. Tentar recuperar dados de uma coluna ordinalmente inferior resulta em um erro. Caso esteja usando cursores de servidor para informar linhas do conjunto de resultados, o aplicativo pode buscar novamente a linha atual e buscar o valor de uma coluna. Se uma instrução for executada no cursor somente de avanço, somente leitura, você deverá executar novamente a instrução para fazer backup de SQLGetData.
O driver ODBC do SQL ServerNative Client informa o comprimento de text com precisão, dos dados ntext e image recuperados usando SQLGetData. O aplicativo pode usar bem o retorno do parâmetro StrLen_or_IndPtr para recuperar dados longos rapidamente.
Observação |
---|
Para tipos de valor grandes, StrLen_or_IndPtr retornará SQL_NO_TOTAL em caixas de truncamento de dados. |
Suporte de SQLGetData a recursos aprimorados de data e hora
Valores da coluna de resultados dos tipos de data/hora são convertidos conforme descrito em Conversões de SQL em C.
Para obter mais informações, consulte Aprimoramentos de data/hora (ODBC).
Suporte de SQLGetData a UDTs grandes do CLR
SQLGetData dá suporte a UDTs (tipos definidos pelo usuário) grandes do CLR. Para obter mais informações, consulte Tipos de dados CLR grandes definidos pelo usuário (ODBC).
Exemplo
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.
}
}