Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Идентификаторы числовых типов данных 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));