Преобразование данных из 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));