Partage via


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));