SQLGetData
SQLGetData est utilisé pour extraire des données de jeu de résultats sans lier de valeurs de colonne. SQLGetData peut être appelé successivement sur la même colonne pour extraire de grandes quantités de données à partir d'une colonne avec un type de données text, 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 toute colonne peuvent être extraites 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 extraire des données de colonnes par ordre aléatoire. Toutes les colonnes indépendantes traitées avec SQLGetData doivent avoir des ordinaux de colonnes plus élevés que les colonnes dépendantes 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 avant uniquement en lecture seule par défaut, vous devez réexécuter l'instruction pour sauvegarder SQLGetData.
Le pilote ODBC SQL Server Native Client signale correctement la longueur des données text, ntext et image extraites à l'aide de SQLGetData. L'application peut utiliser à bon escient le retour de paramètre StrLen_or_IndPtr pour extraire de longues données rapidement.
[!REMARQUE]
Pour les types de valeur élevée, 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 colonnes de résultats de type date/heure sont converties comme décrit dans Conversions de SQL à C.
Pour plus d'informations, consultez Améliorations de la date et de l'heure (ODBC).
Prise en charge SQLGetData pour les types CLR volumineux définis par l'utilisateur
SQLGetData prend en charge les types CLR volumineux définis par l'utilisateur. Pour plus d'informations, consultez Types CLR volumineux définis par l'utilisateur (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.
}
}