SQLGetData
SQLGetData est utilisé pour récupérer des données de jeu de résultats sans liaison de valeurs de colonne. SQLGetData peut être appelé successivement sur la même colonne pour récupérer de grandes quantités de données à partir d’une colonne avec un type de données texte, ntext ou image .
Il n'y a aucune spécification exigeant qu'une application lie des variables pour extraire des données de jeu de résultats. Les données de n’importe quelle colonne peuvent être récupérées à partir du pilote ODBC SQL Server Native Client à l’aide de SQLGetData.
Le pilote ODBC SQL Server Native Client ne prend pas en charge l’utilisation de SQLGetData pour récupérer des données dans l’ordre des colonnes aléatoires. Toutes les colonnes non liées traitées avec SQLGetData doivent avoir des ordinaux de colonne plus élevés que les colonnes liées dans le jeu de résultats. L'application doit traiter les données de la valeur d'ordinal de colonne indépendante la plus basse à la plus élevée. Toute tentative d'extraction de données d'une colonne d'ordinal inférieur provoque une erreur. Si l'application utilise des curseurs côté serveur pour signaler les lignes de jeu de résultats, l'application peut réextraire la ligne actuelle, puis extraire la valeur d'une colonne. Si une instruction est exécutée sur le curseur en lecture seule et avant uniquement par défaut, vous devez réexécurez l’instruction pour sauvegarder SQLGetData.
Le pilote ODBC SQL Server Native Client indique avec précision la longueur des données de texte, de texte etd’image récupérées à l’aide de SQLGetData. L’application peut utiliser correctement le paramètre StrLen_or_IndPtr retour pour récupérer rapidement des données longues.
Notes
Pour les types à grande valeur, StrLen_or_IndPtr retourne SQL_NO_TOTAL en cas de troncation de données.
Prise en charge de SQLGetData pour les fonctionnalités Date et Heure améliorées
Les valeurs de colonne de résultat des types date/heure sont converties comme décrit dans Conversions de SQL en C.
Pour plus d’informations, consultez Améliorations de date et d’heure (ODBC).
Prise en charge SQLGetData pour les types CLR volumineux définis par l'utilisateur
SQLGetData prend en charge les grands types CLR définis par l’utilisateur (UDT). Pour plus d’informations, consultez Grands types de User-Defined CLR (ODBC).
Exemple
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.
}
}