Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
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));