SQLGetData
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics
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, ntextou 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 do driver ODBC do SQL Server Native Client usando SQLGetData.
O driver ODBC do SQL Server Native Client não dá 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 Server Native Client relata com precisão o comprimento dos dados de texto, ntext e imagem 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
Os valores da coluna de resultado dos tipos de data/hora são convertidos conforme descrito em Conversões de SQL para C.
Para obter mais informações, consulte Melhorias de data e 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 ODBC (Tipos Definidos pelo Usuário) CLR Grandes.
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.
}
}