SQLGetData
SQLGetData viene usato per recuperare i dati del set di risultati senza valori di colonna di associazione. SQLGetData può essere chiamato successivamente nella stessa colonna per recuperare grandi quantità di dati da una colonna con un tipo di dati text, ntext o image .
Non è necessario che un'applicazione associ le variabili per recuperare i dati del set di risultati. I dati di qualsiasi colonna possono essere recuperati dal driver ODBC SQL Server Native Client tramite SQLGetData.
Il driver ODBC SQL Server Native Client non supporta l'uso di SQLGetData per recuperare i dati in ordine di colonna casuale. Tutte le colonne non associate elaborate con SQLGetData devono avere ordinali di colonna superiori rispetto alle colonne associate nel set di risultati. L'applicazione deve elaborare i dati dal valore della colonna dell'ordinale non associato più basso al più elevato. Il tentativo di recuperare dati dalla colonna con una numerazione di ordinali più bassa genera un errore. Se l'applicazione sta utilizzando i cursori del server per indicare le righe del set di risultati, può recuperare nuovamente la riga corrente e quindi recuperare il valore di una colonna. Se un'istruzione viene eseguita nel cursore di sola lettura predefinito, forward-only, è necessario eseguire nuovamente l'istruzione per eseguire il backup di SQLGetData.
Il driver ODBC SQL Server Native Client segnala in modo accurato la lunghezza dei dati di testo, ntext e immagine recuperati tramite SQLGetData. L'applicazione può usare in modo ottimale il parametro StrLen_or_IndPtr per recuperare rapidamente i dati lunghi.
Nota
Per i tipi di valore di grandi dimensioni, StrLen_or_IndPtr restituirà SQL_NO_TOTAL in caso di troncamento dei dati.
Supporto di SQLGetData per le caratteristiche avanzate di data e ora
I valori di colonna dei risultati dei tipi di data/ora vengono convertiti come descritto in Conversioni da SQL a C.
Per altre informazioni, vedere Miglioramenti di data e ora (ODBC).
Supporto di SQLGetData per tipi definiti dall'utente CLR di grandi dimensioni
SQLGetData supporta tipi CLR definiti dall'utente di grandi dimensioni. Per altre informazioni, vedere Tipi di User-Defined CLR di grandi dimensioni (ODBC).
Esempio
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.
}
}
Vedere anche
Funzione SQLGetData
Dettagli di implementazione dell'API ODBC