SQLGetData

Aplica-se a: SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)

O SQLGetData é usado para recuperar dados do conjunto de resultados sem atribuir valores de colunas. O SQLGetData pode ser chamado sucessivamente na mesma coluna para recuperar grandes quantidades de dados de uma coluna com um tipo de dado de texto, ntext ou imagem .

Não é necessário que uma aplicação associe variáveis para obter dados do 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 suporta a utilização de SQLGetData para recuperar dados por ordem aleatória de colunas. Todas as colunas não vinculadas processadas com SQLGetData devem ter ordinais de coluna superiores às colunas limitadas no conjunto de resultados. A aplicação deve processar dados desde o valor ordinal não vinculado mais baixo até ao mais alto. Tentar recuperar dados de uma coluna de número ordinal inferior resulta num erro. Se a aplicação estiver a usar cursores do servidor para reportar linhas do conjunto de resultados, pode recuperar a linha atual e depois obter o valor de uma coluna. Se uma instrução for executada no cursor padrão de apenas leitura e apenas avançado, deve reexecutar a instrução para fazer backup do SQLGetData.

O driver ODBC do SQL Server Native Client reporta com precisão o comprimento dos dados de texto, ntext e imagem recuperados usando SQLGetData. A aplicação pode tirar bom proveito do retorno de parâmetro StrLen_or_IndPtr para recuperar dados longos rapidamente.

Note

Para tipos de valor grande, StrLen_or_IndPtr devolverá SQL_NO_TOTAL em casos de truncamento de dados.

Suporte SQLGetData para funcionalidades melhoradas de data e hora

Os valores das colunas dos resultados dos tipos 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 SQLGetData para grandes CLR UDTs

O SQLGetData suporta grandes tipos CLR definidos pelo utilizador (UDTs). Para obter mais informações, consulte Large CLR User-Defined Types (ODBC).

Example

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.  
        }  
    }