SQL a C: Numeric
Los identificadores de los tipos de datos DE ODBC SQL numéricos son los siguientes:
- SQL_DECIMAL
- SQL_BIGINT
- SQL_NUMERIC
- SQL_REAL
- SQL_TINYINT
- SQL_FLOAT
- SQL_SMALLINT
- SQL_DOUBLE SQL_INTEGER
En la tabla siguiente se muestran los tipos de datos ODBC C a los que se pueden convertir los datos numéricos de SQL. Para obtener una explicación de las columnas y los términos de la tabla, vea Convertir datos de SQL a tipos de datos de C.
Identificador de tipo de C | Prueba | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
SQL_C_CHAR | BufferLength de longitud < de bytes de caracteres Número de dígitos enteros < (en lugar de fracciones) BufferLength Número de dígitos enteros >(en lugar de fracciones) = BufferLength |
data Datos truncados No definido |
Longitud de los datos en bytes Longitud de los datos en bytes No definido |
N/D 01004 22003 |
SQL_C_WCHAR | BufferLength de longitud < de caracteres Número de dígitos enteros < (en lugar de fracciones) BufferLength Número de dígitos enteros >(en lugar de fracciones) = BufferLength |
data Datos truncados No definido |
Longitud de datos en caracteres Longitud de datos en caracteres No definido |
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 |
Datos convertidos sin truncamiento[a] Datos convertidos con truncamiento de dígitos fraccionarios[a] La conversión de datos provocaría la pérdida de dígitos enteros (en lugar de fracciones) [a] |
data Datos truncados No definido |
Tamaño del tipo de datos C Tamaño del tipo de datos C No definido |
N/D 01S07 22003 |
SQL_C_FLOAT SQL_C_DOUBLE |
Los datos están dentro del intervalo del tipo de datos al que se va a convertir el número[a] Los datos están fuera del intervalo del tipo de datos al que se va a convertir el número[a] |
data No definido |
Tamaño del tipo de datos C No definido |
N/D 22003 |
SQL_C_BIT | Los datos son 0 o 1[a] Los datos son mayores que 0, menores que 2 y no son iguales a 1[a] Los datos son menores que 0 o mayores o iguales que 2[a] |
data Datos truncados No definido |
1[b] 1[b] No definido |
N/D 01S07 22003 |
SQL_C_BINARY | Longitud de bytes de datos <= BufferLength Longitud de bytes de BufferLength de datos > |
data No definido |
Longitud de los datos No definido |
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] | Datos no truncados Fracciones de segundos truncados Parte completa del número truncado |
data Datos truncados No definido |
Longitud de los datos en bytes Longitud de los datos en bytes No definido |
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 completa del número truncado | No definido | No definido | 22015 |
[a] El valor de BufferLength se omite para esta conversión. El controlador supone que el tamaño de *TargetValuePtr es el tamaño del tipo de datos de C.
[b] Este es el tamaño del tipo de datos de C correspondiente.
[c] Esta conversión solo se admite para los tipos de datos numéricos exactos (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER y SQL_BIGINT). No se admite para los tipos de datos numéricos aproximados (SQL_REAL, SQL_FLOAT o SQL_DOUBLE).
SQL_C_NUMERIC y SQLSetDescField
La función SQLSetDescField es necesaria para realizar el enlace manual con valores de SQL_C_NUMERIC. (Tenga en cuenta que SQLSetDescField se agregó en ODBC 3.0). Para realizar el enlace manual, primero debe obtener el identificador del descriptor.
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));