다음을 통해 공유


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