Поделиться через


Преобразование данных из SQL в C: числовые данные

Идентификаторы числовых типов данных ODBC SQL приведены ниже.

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

В следующей таблице показаны типы данных ODBC C, в которые могут быть преобразованы числовые данные SQL. Описание столбцов и терминов в таблице см. в разделе "Преобразование данных из SQL в типы данных C".

Идентификатор типа C Тест *TargetValuePtr *StrLen_or_IndPtr SQLSTATE
SQL_C_CHAR Длина <байтов символа BufferLength

Число целых (в отличие от дробных) цифр <BufferLength

Число целых (в отличие от дробных) цифр >= BufferLength
Data

Усеченные данные

Undefined
Длина данных в байтах

Длина данных в байтах

Undefined
Недоступно

01004

22003
SQL_C_WCHAR Буфер длины <символа BufferLength

Число целых (в отличие от дробных) цифр <BufferLength

Число целых (в отличие от дробных) цифр >= BufferLength
Data

Усеченные данные

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]
Data

Усеченные данные

Undefined
Размер типа данных C

Размер типа данных C

Undefined
Недоступно

01S07

22003
SQL_C_FLOAT

SQL_C_DOUBLE
Данные находится в диапазоне типа данных, в который преобразуется число[a]

Данные находятся вне диапазона типа данных, в который преобразуется число[a]
Data

Undefined
Размер типа данных C

Undefined
Недоступно

22003
SQL_C_BIT Данные : 0 или 1[a]

Данные больше 0, менее 2 и не равны 1[a]

Данные меньше 0 или больше или равно 2[a]
Data

Усеченные данные

Undefined
1[b]

1[b]

Undefined
Недоступно

01S07

22003
SQL_C_BINARY Длина байтов данных <= BufferLength

Длина байтов данных >BufferLength
Data

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] Данные не усечены

Доля секунд, усеченная

Вся часть усеченного числа
Data

Усеченные данные

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