SQL à C : Numérique
Les identificateurs des types de données SQL ODBC numériques sont les suivants :
- SQL_DECIMAL
- SQL_BIGINT
- SQL_NUMERIC
- SQL_REAL
- SQL_TINYINT
- SQL_FLOAT
- SQL_SMALLINT
- SQL_DOUBLE SQL_INTEGER
Le tableau suivant montre les types de données ODBC C vers lesquels les données SQL numériques peuvent être converties. Pour obtenir une explication des colonnes et des termes de la table, consultez Conversion de données de SQL en types de données C.
Identificateur de type C | Test | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
SQL_C_CHAR | Caractère de longueur <d’octet BufferLength Nombre de chiffres entiers (par opposition aux fractions<) BufferLength Nombre de chiffres entiers (par opposition aux fractions >) = BufferLength |
Données Données tronquées Indéfini |
Longueur des données en octets Longueur des données en octets Indéfini |
n/a 01004 22003 |
SQL_C_WCHAR | Longueur de caractères <BufferLength Nombre de chiffres entiers (par opposition aux fractions<) BufferLength Nombre de chiffres entiers (par opposition aux fractions >) = BufferLength |
Données Données tronquées Indéfini |
Longueur des données en caractères Longueur des données en caractères Indéfini |
n/a 01004 22003 |
SQL_C_STINYINT SQL_C_UTINYINT SQL_C_TINYINT SQL_C_SBIGINT SQL_C_UBIGINT SQL_C_SSHORT SQL_C_USHORT SQL_C_SHORT SQL_C_SLONG SQL_C_ULONG SQL_C_LONG SQL_C_NUMERIC |
Données converties sans troncation[a] Données converties avec troncation de chiffres fractionnaires[a] La conversion de données entraînerait la perte de chiffres entiers (par opposition à des chiffres fractionnaires)[a] |
Données Données tronquées Indéfini |
Taille du type de données C Taille du type de données C Indéfini |
n/a 01S07 22003 |
SQL_C_FLOAT SQL_C_DOUBLE |
Les données se trouvent dans la plage du type de données vers lequel le nombre est converti[a] Les données se trouvent en dehors de la plage du type de données vers lequel le nombre est converti[a] |
Données Indéfini |
Taille du type de données C Indéfini |
n/a 22003 |
SQL_C_BIT | Les données sont 0 ou 1[a] Les données sont supérieures à 0, inférieures à 2 et non égales à 1[a] Les données sont inférieures à 0 ou supérieures ou égales à 2[a] |
Données Données tronquées Indéfini |
1[b] 1[b] Indéfini |
n/a 01S07 22003 |
SQL_C_BINARY | Longueur en octets des données <= BufferLength Longueur en octets des données >BufferLength |
Données Indéfini |
Longueur des données Indéfini |
n/a 22003 |
SQL_C_INTERVAL_MONTH[c] SQL_C_INTERVAL_YEAR[c] SQL_C_INTERVAL_DAY[c] SQL_C_INTERVAL_HOUR[c] SQL_C_INTERVAL_MINUTE[c] SQL_C_INTERVAL_SECOND[c] | Données non tronquées Fractions de secondes tronquées Partie entière du nombre tronqué |
Données Données tronquées Indéfini |
Longueur des données en octets Longueur des données en octets Indéfini |
n/a 01S07 22015 |
SQL_C_INTERVAL_YEAR_TO_MONTH SQL_C_INTERVAL_DAY_TO_HOUR SQL_C_INTERVAL_DAY_TO_MINUTE SQL_C_INTERVAL_DAY_TO_SECOND SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_C_INTERVAL_HOUR_TO_SECOND | Partie entière du nombre tronqué | Indéfini | Indéfini | 22015 |
[a] La valeur de BufferLength est ignorée pour cette conversion. Le pilote suppose que la taille de *TargetValuePtr est la taille du type de données C.
[b] Il s’agit de la taille du type de données C correspondant.
[c] Cette conversion est prise en charge uniquement pour les types de données numériques exacts (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER et SQL_BIGINT). Il n’est pas pris en charge pour les types de données numériques approximatifs (SQL_REAL, SQL_FLOAT ou SQL_DOUBLE).
SQL_C_NUMERIC et SQLSetDescField
La fonction SQLSetDescField est requise pour effectuer une liaison manuelle avec SQL_C_NUMERIC valeurs. (Notez que SQLSetDescField a été ajouté dans ODBC 3.0.) Pour effectuer une liaison manuelle, vous devez d’abord obtenir le handle de descripteur.
if (fCType == SQL_C_NUMERIC) {
// special processing required for NUMERIC to get right scale & precision
// Modify the fields in the implicit application parameter descriptor
SQLHDESC hdesc=NULL;
// Use SQL_ATTR_APP_ROW_DESC for calls to SQLBindCol()
// Use SQL_ATTR_APP_PARAM_DESC for calls to SQLBindParameter()
//
// retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0, NULL);
retcode = SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, NULL);
if (!ODBC_CALL_SUCCESS(retcode)) {
printf ("\nSQLGetStmtAttr failed");
i = 1;
sqlstate[7] = '\0';
while (SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, i, sqlstate, &NativeError, wrkbuf, sizeof(wrkbuf), &len) != SQL_NO_DATA) {
printf("\niTestCase = %d Failed...Precision = %d, Scale = %d\nNativeError=%d, State=%s, \n Message=%s",
iTestCase, Precision, Scale, NativeError, sqlstate, wrkbuf);
i++;
}
continue;
}
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_TYPE, (SQLPOINTER) SQL_C_NUMERIC, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_PRECISION, (SQLPOINTER)num.precision, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_SCALE, (SQLPOINTER)num.scale, 0);
if (!ODBC_CALL_SUCCESS(retcode))
goto error;
retcode = SQLSetDescField(hdesc, iCol, SQL_DESC_DATA_PTR, (SQLPOINTER) &(num), sizeof(num));