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