SQL에서 C로: 숫자
숫자 ODBC SQL 데이터 형식의 식별자는 다음과 같습니다.
- SQL_DECIMAL
- SQL_BIGINT
- SQL_NUMERIC
- SQL_REAL
- SQL_TINYINT
- SQL_FLOAT
- SQL_SMALLINT
- SQL_DOUBLE SQL_INTEGER
다음 표에서는 숫자 SQL 데이터를 변환할 수 있는 ODBC C 데이터 형식을 보여줍니다. 테이블의 열 및 용어에 대한 설명은 SQL에서 C 데이터 형식으로 데이터 변환을 참조 하세요.
C 형식 식별자 | 테스트 | *TargetValuePtr | *StrLen_or_IndPtr | SQLSTATE |
---|---|---|---|---|
SQL_C_CHAR | 문자 바이트 길이 <BufferLength 전체(소수 자릿수가 아님) 숫자 BufferLength의 <수 소수 자릿수가 아닌 전체 숫자 >= BufferLength |
데이터 잘린 데이터 Undefined |
데이터 길이(바이트) 데이터 길이(바이트) Undefined |
해당 없음 01004 22003 |
SQL_C_WCHAR | 문자 길이 <BufferLength 전체(소수 자릿수가 아님) 숫자 BufferLength의 <수 소수 자릿수가 아닌 전체 숫자 >= BufferLength |
데이터 잘린 데이터 Undefined |
문자의 데이터 길이 문자의 데이터 길이 Undefined |
해당 없음 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 |
잘림 없이 변환된 데이터[a] 소수 자릿수 잘림으로 변환된 데이터[a] 데이터를 변환하면 소수 자릿수가 아닌 전체 자릿수가 손실됩니다.[a] |
데이터 잘린 데이터 Undefined |
C 데이터 형식의 크기 C 데이터 형식의 크기 Undefined |
해당 없음 01S07 22003 |
SQL_C_FLOAT SQL_C_DOUBLE |
데이터는 숫자가 변환되는 데이터 형식의 범위 내에 있습니다.[a] 데이터가 숫자가 변환되는 데이터 형식 범위를 벗어났습니다.[a] |
데이터 Undefined |
C 데이터 형식의 크기 Undefined |
해당 없음 22003 |
SQL_C_BIT | 데이터는 0 또는 1[a] 데이터가 0보다 크고 2보다 작으며 1[a] 데이터가 0보다 작거나 2보다 크거나 같음[a] |
데이터 잘린 데이터 Undefined |
1[b] 1[b] Undefined |
해당 없음 01S07 22003 |
SQL_C_BINARY | 데이터의 <바이트 길이 = BufferLength Data >BufferLength의 바이트 길이 |
데이터 Undefined |
데이터 길이 Undefined |
해당 없음 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] | 잘리지 않은 데이터 소수 자릿수 초 부분이 잘렸습니다. 잘린 숫자의 전체 부분 |
데이터 잘린 데이터 Undefined |
데이터 길이(바이트) 데이터 길이(바이트) Undefined |
해당 없음 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 | 잘린 숫자의 전체 부분 | Undefined | Undefined | 22015 |
[a] 이 변환에서는 BufferLength 값이 무시됩니다. 드라이버는 *TargetValuePtr 의 크기가 C 데이터 형식의 크기라고 가정합니다.
[b] 해당 C 데이터 형식의 크기입니다.
[c] 이 변환은 정확한 숫자 데이터 형식(SQL_DECIMAL, SQL_NUMERIC, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER 및 SQL_BIGINT)에 대해서만 지원됩니다. 근사 숫자 데이터 형식(SQL_REAL, SQL_FLOAT 또는 SQL_DOUBLE)에는 지원되지 않습니다.
SQL_C_NUMERIC 및 SQLSetDescField
SQLSetDescField 함수는 SQL_C_NUMERIC 값으로 수동 바인딩을 수행하는 데 필요합니다. (SQLSetDescField는 ODBC 3.0에 추가되었습니다.) 수동 바인딩을 수행하려면 먼저 설명자 핸들을 가져와야 합니다.
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));