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