Partilhar via


SQL para C: numérico

Os identificadores para os tipos de dados SQL ODBC numéricos são os seguintes:

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

A tabela a seguir mostra os tipos de dados ODBC C para os quais os dados SQL numéricos podem ser convertidos. Para obter uma explicação das colunas e dos termos na tabela, consulte Convertendo dados de tipos de dados SQL para C.

Identificador de tipo C Teste *TargetValuePtr *Strlen_or_indptr SQLSTATE
SQL_C_CHAR BufferLength de comprimento <de byte de caractere

Número de dígitos inteiros (em vez de fracionários<) BufferLength

Número de dígitos inteiros (em vez de fracionários >) = BufferLength
Dados

Dados truncados

Indefinido
Comprimento dos dados em bytes

Comprimento dos dados em bytes

Indefinido
n/d

01004

22003
SQL_C_WCHAR BufferLength de comprimento de caractere <

Número de dígitos inteiros (em vez de fracionários<) BufferLength

Número de dígitos inteiros (em vez de fracionários >) = BufferLength
Dados

Dados truncados

Indefinido
Comprimento dos dados em caracteres

Comprimento dos dados em caracteres

Indefinido
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
Dados convertidos sem truncamento[a]

Dados convertidos com truncamento de dígitos fracionários[a]

A conversão de dados resultaria em perda de dígitos inteiros (em vez de fracionários) [a]
Dados

Dados truncados

Indefinido
Tamanho do tipo de dados C

Tamanho do tipo de dados C

Indefinido
n/d

01S07

22003
SQL_C_FLOAT

SQL_C_DOUBLE
Os dados estão dentro do intervalo do tipo de dados no qual o número está sendo convertido[a]

Os dados estão fora do intervalo do tipo de dados no qual o número está sendo convertido[a]
Dados

Indefinido
Tamanho do tipo de dados C

Indefinido
n/d

22003
SQL_C_BIT Os dados são 0 ou 1[a]

Os dados são maiores que 0, menores que 2 e não são iguais a 1[a]

Os dados são menores que 0 ou maiores ou iguais a 2[a]
Dados

Dados truncados

Indefinido
1[b]

1[b]

Indefinido
n/d

01S07

22003
SQL_C_BINARY Comprimento de bytes de dados <= BufferLength

Comprimento de byte de buffer de dadosLength>
Dados

Indefinido
Comprimento dos dados

Indefinido
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] Dados não truncados

Parte de segundos fracionários truncada

Parte inteira do número truncado
Dados

Dados truncados

Indefinido
Comprimento dos dados em bytes

Comprimento dos dados em bytes

Indefinido
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 inteira do número truncado Indefinido Indefinido 22015

[a] O valor de BufferLength é ignorado para essa conversão. O driver pressupõe que o tamanho de *TargetValuePtr seja o tamanho do tipo de dados C.

[b] Esse é o tamanho do tipo de dados C correspondente.

[c] Essa conversão tem suporte apenas para os tipos de dados numéricos exatos (SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER e SQL_BIGINT). Não há suporte para os tipos de dados numéricos aproximados (SQL_REAL, SQL_FLOAT ou SQL_DOUBLE).

SQL_C_NUMERIC e SQLSetDescField

A função SQLSetDescField é necessária para executar a associação manual com valores SQL_C_NUMERIC. (Observe que SQLSetDescField foi adicionado no ODBC 3.0.) Para executar a associação manual, primeiro você deve obter o identificador do descritor.

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