Compartir a través de


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