Partilhar via


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, 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 SQL Server Native Client driver ODBC usando SQLGetData.

O driver ODBC 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 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 de coluna de resultado de 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 Tipos de User-Defined CLR grandes (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.  
        }  
    }  

Consulte Também

Função SQLGetData
ODBC API Implementation Details