powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Параметры функции SQLDescribeCol (ODBC )
9 сообщений из 9, страница 1 из 1
Параметры функции SQLDescribeCol (ODBC )
    #38535663
iMerlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день.

Никак не разберусь:
мне необходимо выполнить произвольный запрос к БД, проанализировать вернувшиеся поля и в зависимости от их типа считать из них данные.

Ну начало понятно - SQLAllocHandle, SQLConnect, SQLExecDirect.
Далее - непонятно. SQLGetData требует на входе параметр "тип данных" из перечисления (SQL_C_CHAR, SQL_C_SHORT...)
SQLDescribeCol по всем источникам отдает переменную "тип данных" из перечисления: (SQL_CHAR, SQL_SMALLINT...)
Они там, частично совпадают, частично нет.
В связи с эти вопрос: это действительно так? Эти две функции используют две разные кодировки типов данных? То есть резюме: надо перекодировать типы данных вернувшиеся из SQLDescribeCol перед передачей их SQLGetData?


Помогите кто может, кто может, помогите!!! (с)Булычев. :-)
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535682
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMerlin,

(SQL_C_CHAR, SQL_C_SHORT...) -- это типы данных полей на клиентской стороне. В программе на С.
(SQL_CHAR, SQL_SMALLINT...) -- это типы данных полей в БД, с точки зрения SQL.

При бинде ты мапируешь серверный тип (тип БД) на клиетский, оба указываются в вызове соотв. функции.
При этом заметь, что некоторым типам данных БД соответствуют 2 и более клиентских типов.
Например, SQL_INT может быть получен клиентов в виде целого числа, или в виде преобразованного в символьный вид образа этого числа.

Для начала ты можешь для простоты все типы БД преобразовывать в симпольный вид, это может быть немного проще -- не нужно составлять таблицу соответствий типов.
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535829
iMerlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Дело в том, что я не биндю, у меня несколько специфическая задача стоит - мне надо именно реализовать все-во-все, и мне проще считать данные SQLGetData, а потом разобраться что куда преобразовать.
То есть грубо говоря у меня switch, который раскидывает ветки по типу, возвращенному SQLDescribeCol, в каждом case считывание данных в "родную" для типа колонки переменную (union на все возможные типы и структуры организовал) и затем вложенный switch, раскидывающий ветви уже по тому типу, который нужен пользователю, в каждом case преобразование.

В простом варианте - когда я четко знаю тип колонки и тип переменной куда считаю данные - у меня никаких проблем.
Проблемы в том, что я не знаю что должна возвращать SQLDescribeCol. Беда такая: я пишу для использования в будущем совместно с SQL server, но сервера пока нет, я пока весь код на Access'e отлаживаю, а у него половины типов данных нет, отладчиком не посмотришь.

Прошу все таки раскрыть, по возможности, SQLDescribeCol созвращает C или SQL типы?

авторНапример, SQL_INT может быть получен клиентов в виде целого числа, или в виде преобразованного в символьный вид образа этого числа.

Как интересно. А я ручками из INT перевожу... То есть можно в SQLGetData числовой колонке подсунуть указатель на буфер и тип данных SQL_C_CHAR и драйвер сам все перекодирует?


Спасибо за ответ.
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535846
iMerlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivНапример, SQL_INT может быть получен клиентов в виде целого числа, или в виде преобразованного в символьный вид образа этого числа.

Простите, еще такой вопрос: такие страшные типы данных как Decimal и Numeric, я их сейчас как в msdn рекомендовано считываю: структура SQLNumeric на входе, из нее беру строку байт и записываю в double по циклу: n0+n1*256+n2*65536... А что, можно указать что принимаю double и драйвер сам все это сделает? Я бы сам попробовал, но как уже писал самого SQL сервера пока нет.
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535889
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMerlinПрошу все таки раскрыть, по возможности, SQLDescribeCol созвращает C или SQL типы?




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQLRETURN SQLDescribeCol(
      SQLHSTMT       StatementHandle,
      SQLUSMALLINT   ColumnNumber,
      SQLCHAR *      ColumnName,
      SQLSMALLINT    BufferLength,
      SQLSMALLINT *  NameLengthPtr,
      SQLSMALLINT *  DataTypePtr,
      SQLULEN *      ColumnSizePtr,
      SQLSMALLINT *  DecimalDigitsPtr,
      SQLSMALLINT *  NullablePtr);

...

 DataTypePtr

    [Output] Pointer to a buffer in which  to return the SQL data type of the column . This value is read from the SQL_DESC_CONCISE_TYPE field of the IRD. 
This will be one of the values in SQL Data Types, or a driver-specific SQL data type.
 If the data type cannot be determined, the driver returns SQL_UNKNOWN_TYPE.


Т.е. это серверный тип данных, тип данных в БД, по стандарту ANSI SQL.


iMerlinКак интересно. А я ручками из INT перевожу... То есть можно в SQLGetData числовой колонке подсунуть указатель на буфер и тип данных SQL_C_CHAR и драйвер сам все перекодирует?


Да.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQLRETURN SQLGetData(
      SQLHSTMT       StatementHandle,
      SQLUSMALLINT   Col_or_Param_Num,
      SQLSMALLINT    TargetType,
      SQLPOINTER     TargetValuePtr,
      SQLLEN         BufferLength,
      SQLLEN *       StrLen_or_IndPtr);

...

 TargetType

    [Input] The type identifier  of the C data type of the *TargetValuePtr buffer . 
For a list of valid C data types and type identifiers, see the C Data Types section in Appendix D: Data Types.

...

    [Output] Pointer to the buffer in which to return the data.

    TargetValuePtr cannot be NULL.



Так что пишешь в TargetType SQL_C_CHAR, а в TargetValuePtr -- указатель на символьный буфер (особый гемор с тем, чтобы предварительно посчитать правильно его длину и выделить его).
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535900
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, там, в документации, на сколько я помню, всё время используются два термина:
SQL data type -- это тип в БД

C data type -- это тип в клиентской программе.
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535982
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще полезно будет посмотреть здесь:
http://msdn.microsoft.com/en-us/library/ms716298(v=vs.85).aspx
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38535992
iMerlin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, начало потихоньку проясняться.
Теперь понял, для чего та таблица про совместимость - я до этого думал, она показывает что тип В ПРИНЦИПЕ может быть преобразован в другой - ручками, а оно оказывается вот как...
Все уже украдено, до нас...
...
Рейтинг: 0 / 0
Параметры функции SQLDescribeCol (ODBC )
    #38536030
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMerlin,

Так так и есть, там проставлены что можно преобразовывать куда, а что нет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Параметры функции SQLDescribeCol (ODBC )
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]