powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQL_OV_ODBC3 и SQL_TIMESTAMP
11 сообщений из 11, страница 1 из 1
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38199273
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

имеется следующий код:
SQLBindParameter(hstnt1,pCnt,SQL_PARAM_INPUT,SQL_C_TIMESTAMP,SQL_TIMESTAMP,sizeof(SQL_IMESTAMP_STRUCT),0,&ts,sizeof(SQL_TIMESTAMP_STRUCT),NULL);

При использовании ODBC второй версии:
SQLSetEnvAttr(henv1,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC2,0);
Код отрабатывает нормально.
Когда переключаюсь на третью версию ODBC:
SQLSetEnvAttr(henv1,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);

При исполнении SQLExecDirect возникает следующая ошибка:
"Переполнение поля даты и времени".
Замена SQL_C_TIMESTAMP на SQL_C_TYPE_TIMESTAMP
и
SQL_TIMESTAMP на SQL_TYPE_TIMESTAMP
результата не дает.

Подскажите пожалуйста, в какую сторону посмотреть.
Спасибо.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38199318
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max950Подскажите пожалуйста, в какую сторону посмотреть.В сторону опечаток.
Описание действий по апгрейду правильное. А насколько тщательно это все произведено - неизвестно.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202089
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть кому-то будет интересно:
Методом научного тыка понял, что если обнулить секунды, то запрос выполняется нормально. После этого стал смотреть в сторону
размерных параметров. Помогла вот эта статья:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms711786%28v=vs.85%29.aspx
в частности вот это:
=====================================
SQL_TYPE_TIMESTAMP

16 (the number of characters in the yyyy-mm-dd hh:mm format)

19 (the number of characters in the yyyy-mm-dd hh:mm:ss format)

or

20 + s (the number of characters in the yyyy-mm-dd hh:mm:ss[.fff...] format, where s is the seconds precision).
======================================
в моем коде:
SQLBindParameter(hstnt1,pCnt,SQL_PARAM_INPUT,SQL_C_TIMESTAMP,SQL_TIMESTAMP,sizeof(SQL_IMESTAMP_STRUCT),0,&ts,sizeof(SQL_TIMESTAMP_STRUCT),NULL);

sizeof(SQL_IMESTAMP_STRUCT) или sizeof(ts) дает 16

Предполагаю, что в ODBC3 заложены более жесткие условия проверки переменных на "правильность".

Вот в таком виде:
SQLBindParameter(hstnt1,pCnt,SQL_PARAM_INPUT,SQL_C_TYPE_TIMESTAMP,SQL_TYPE_TIMESTAMP,23,3,&ts,NULL,NULL);
код отрабатывает.
Есть вопросы по двум последним параметрам, но это отдельный вопрос.

Спасибо.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202201
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должно быть SQL_C_TYPE_TIMESTAMP

Ну и параметры ---
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQLRETURN SQLBindParameter(
      SQLHSTMT        StatementHandle,
      SQLUSMALLINT    ParameterNumber,
      SQLSMALLINT     InputOutputType,
      SQLSMALLINT     ValueType,
      SQLSMALLINT     ParameterType,
      SQLULEN         ColumnSize,
      SQLSMALLINT     DecimalDigits,
      SQLPOINTER      ParameterValuePtr,
      SQLLEN          BufferLength,
      SQLLEN *        StrLen_or_IndPtr);

SQLBindParameter(hstnt1,
pCnt, // это указатель на соединение ? А должен быть номер параметра по порядку.
SQL_PARAM_INPUT,
SQL_C_TIMESTAMP, // должен быть SQL_C_TYPE_TIMESTAMP
SQL_TIMESTAMP, 
sizeof(SQL_IMESTAMP_STRUCT), // это тип фиксированной длины, должен быть 0.
0,
&ts, 
sizeof(SQL_TIMESTAMP_STRUCT),
NULL);
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202206
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стал смотреть в сторону размерных параметров.

Ты разве используешь векторные параметры ?
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202269
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. sizeof(SQL_IMESTAMP_STRUCT)
ошибся при копировании, должно быть:
sizeof(SQL_TIMESTAMP_STRUCT)

2. pCnt, // это указатель на соединение ? А должен быть номер параметра по порядку.
в оригинале paramCnt, т.е. счетчик параметров - число.

4. Речь идет про переход с ODBC2 на ODBC3,
соответственно сначала было SQL_C_TIMESTAMP
потом SQL_C_TYPE_TIMESTAMP

3. стал смотреть в сторону размерных параметров.
Ты разве используешь векторные параметры ?

Нет. Возможно использовал не тот термин.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202303
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
5.

sizeof(SQL_IMESTAMP_STRUCT), // это тип фиксированной длины, должен быть 0.

Судя по нижеуказанному, не похоже, чтобы это было так:
===============

SQLRETURN SQLBindParameter(
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLULEN ColumnSize,
SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);

===============

Column Size

For the time, timestamp, and all interval data types, this is the number of characters in the character representation of this data

SQL_TYPE_TIMESTAMP


16 (the number of characters in the yyyy-mm-dd hh:mm format)

19 (the number of characters in the yyyy-mm-dd hh:mm:ss format)

or

20 + s (the number of characters in the yyyy-mm-dd hh:mm:ss[.fff...] format, where s is the seconds precision).

http://msdn.microsoft.com/en-us/library/windows/desktop/ms711786%28v=vs.85%29.aspx
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38202877
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max9505.

sizeof(SQL_IMESTAMP_STRUCT), // это тип фиксированной длины, должен быть 0.

Судя по нижеуказанному, не похоже, чтобы это было так:

Column Size

For the time, timestamp, and all interval data types, this is the number of characters in the character representation of this data

SQL_TYPE_TIMESTAMP


Это про SQL_TYPE - про тип данных в БД.
Это про тот случай, когда ты при биндинге преобразуешь данные из SQL_TYPE_TIMESTAMP в текстовый вид.

Ты же биндишь на структуру, представляющую TIMESTAMP в памяти, она фиксированного и заранее предопределённого (спецификацией ODBC и заголовком, описывающим структуру) формата и размера, поэтому не нужно там никакого размера,
но параметр в этом случае просто должен игнорироваться, т.е. это не страшно, если ты там что-то укажешь.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38203760
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас попробовал поставить 0 в "Colomn size".
Получаю ошибку "Неверное поле COUNT или ошибка синтаксиса".
Еще раз, чтобы была ясность, это происходит, когда я принудительно включаю ODBC3:
SQLSetEnvAttr(henv1,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
Независимо от того, использую я SQL_TIMESTAMP или SQL_TYPE_TIMESTAMP.
Скорее всего спецификация ODBC3 более "жесткая" к параметрам, чем ODBC2.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38203982
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max950,

Ну найди то место, где она более жёсткая...

Я думаю, что скорее всего у тебя программа была некорректной и до, и после 3.0, только в 3.0
это проявляется в силу каких=то его особеностей, другой реализации, а в 2.0 -- нет.
...
Рейтинг: 0 / 0
SQL_OV_ODBC3 и SQL_TIMESTAMP
    #38205105
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max950,
Мы делаем так, но у нас не используется odbc3.0. рабоатет с TimesTen & Postgresql
Код: plaintext
1.
2.
3.
4.
5.
6.
#define TT_BIND_PARAMETER_TIMESTAMP(data) \
    do { \
        TT_CHECK_PARAM_INDEX(data, SQL_C_TIMESTAMP, SQL_PARAM_INPUT)                                 \
        SQLRETURN rc = SQLBindParameter((__stmt)->hstmt, __paramIndex++, SQL_PARAM_INPUT, SQL_C_TIMESTAMP, SQL_TIMESTAMP, 0, 0, &(data), 0, NULL); \
        TT_HANDLE_ERRORS(connection, (__stmt), "ODBC - binding SQL_TIMESTAMP parameter " #data);\
    } while (0);
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQL_OV_ODBC3 и SQL_TIMESTAMP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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