Da SQL a C: dati numerici

Gli identificatori per i tipi di dati SQL ODBC numerici sono i seguenti:

  • SQL_DECIMAL
  • SQL_BIGINT
  • SQL_NUMERIC
  • SQL_REAL
  • SQL_TINYINT
  • SQL_FLOAT
  • SQL_SMALLINT
  • SQL_DOUBLE SQL_INTEGER

Nella tabella seguente vengono illustrati i tipi di dati ODBC C in cui è possibile convertire i dati SQL numerici. Per una spiegazione delle colonne e dei termini nella tabella, vedere Conversione di dati da SQL a tipi di dati C.

Identificatore del tipo C Test *TargetValuePtr *StrLen_or_IndPtr SQLSTATE
SQL_C_CHAR Lunghezza byte <carattere BufferLength

Numero di cifre intere <(anziché frazionarie) BufferLength

Numero di cifre intere >(anziché frazionarie) = BufferLength
Dati

Dati troncati

Non definito
Lunghezza dei dati in byte

Lunghezza dei dati in byte

Non definito
N/D

01004

22003
SQL_C_WCHAR BufferLength lunghezza <carattere

Numero di cifre intere <(anziché frazionarie) BufferLength

Numero di cifre intere >(anziché frazionarie) = BufferLength
Dati

Dati troncati

Non definito
Lunghezza dei dati in caratteri

Lunghezza dei dati in caratteri

Non definito
N/D

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
Dati convertiti senza troncamento[a]

Dati convertiti con troncamento di cifre frazionarie[a]

La conversione dei dati comporta la perdita di cifre intere (anziché frazionarie) [a]
Dati

Dati troncati

Non definito
Dimensioni del tipo di dati C

Dimensioni del tipo di dati C

Non definito
N/D

01S07

22003
SQL_C_FLOAT

SQL_C_DOUBLE
I dati si trovano all'interno dell'intervallo del tipo di dati in cui viene convertito il numero[a]

I dati non rientrano nell'intervallo del tipo di dati in cui viene convertito il numero[a]
Dati

Non definito
Dimensioni del tipo di dati C

Non definito
N/D

22003
SQL_C_BIT I dati sono 0 o 1[a]

I dati sono maggiori di 0, minori di 2 e non uguali a 1[a]

I dati sono minori di 0 o maggiori o uguali a 2[a]
Dati

Dati troncati

Non definito
1[b]

1[b]

Non definito
N/D

01S07

22003
SQL_C_BINARY Lunghezza byte dei dati <= BufferLength

Lunghezza byte dei dati >BufferLength
Dati

Non definito
Lunghezza dei dati

Non definito
N/D

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] Dati non troncati

Parte frazionaria dei secondi troncata

Parte intera del numero troncato
Dati

Dati troncati

Non definito
Lunghezza dei dati in byte

Lunghezza dei dati in byte

Non definito
N/D

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 Parte intera del numero troncato Non definito Non definito 22015

[a] Il valore di BufferLength viene ignorato per questa conversione. Il driver presuppone che le dimensioni di *TargetValuePtr siano le dimensioni del tipo di dati C.

[b] Questa è la dimensione del tipo di dati C corrispondente.

[c] Questa conversione è supportata solo per i tipi di dati numerici esatti (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER e SQL_BIGINT). Non è supportato per i tipi di dati numerici approssimativi (SQL_REAL, SQL_FLOAT o SQL_DOUBLE).

SQL_C_NUMERIC e SQLSetDescField

La funzione SQLSetDescField è necessaria per eseguire l'associazione manuale con valori di SQL_C_NUMERIC. Si noti che SQLSetDescField è stato aggiunto in ODBC 3.0. Per eseguire l'associazione manuale, è prima necessario ottenere l'handle del descrittore.

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