Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с генераторами 
:(
    Опции темы
RSV
Дата 25.10.2005, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.6.2005

Репутация: нет
Всего: нет



CDatabase m_db;
CRecordset m_rs;
CDBVariant var;
int n_Id;

char sql[] = "SELECT GEN_ID(Client_gen, 0) FROM RDB$DATABASE";
m_rs.m_pDatabase = &m_db;

m_rs.Open(CRecordset::forwardOnly, sql, CRecordset::readOnly);
m_rs.GetFieldValue((short)0, var);
n_Id = var.m_iVal;
m_rs.Close();

Вопрос. Во всех статьях о генераторах описано, что таким способом
(SELECT GEN_ID(Client_gen, 0) FROM RDB$DATABASE) можно узнать текущее
значение генератора Client_gen. Почему в моем приложении значение
var.m_iVal при любом количестве вызова GEN_ID(Client_gen, 1)постоянно
равно одному и тому же значению (28728).

Версия: Firebird 1.5.
Способ доступа: VC++;
PM MAIL   Вверх
МихаилК
Дата 25.10.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2005

Репутация: нет
Всего: нет



В GEN_ID вторым параметром идет приращение. В приведенном тобой примере он равно 0, поэтому и возвращается одно и тоже число (текущее значение генератора), попробуй изменить на 1, например.
Кроме того, по непроверенным данным (слышал краем глаза) в FB1.5.0 Classic не видно изменение значения генератора после вызова функции GEN_ID в другой транзакции, до подтверждения текущей. Еще раз повторюсь - информация непроверенная, но есть некоторая вероятность ее подлинности.
Удачи
PM MAIL   Вверх
Петрович
Дата 25.10.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата
Кроме того, по непроверенным данным (слышал краем глаза) в FB1.5.0 Classic не видно изменение значения генератора после вызова функции GEN_ID в другой транзакции, до подтверждения текущей.

Сильно сомневаюсь. Иначе, вообще теряется смысл существования генераторов. Их основная ценность в том, что они живут вне механизма транзакций.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
МихаилК
Дата 25.10.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2005

Репутация: нет
Всего: нет



Цитата
Сильно сомневаюсь. Иначе, вообще теряется смысл существования генераторов. Их основная ценность в том, что они живут вне механизма транзакций.

Я тоже сомневался, но один программист из нашей группы разработчиков говорит, что это так. Причем я видел собственными глазами, что в другой транзакции действительно генератор не изменял своего значения до подтверждения изменяющей транзакции. Мы с ним долго поудивлялись и решили Classic не использовать. Остается правда вероятность, что он где-то напортачил с вызовами (детално я не вникал), но вероятность этого не слишком высока. Может еще тестировалось на какой-то не релизной версии FB - сейчас мы это уже не узнаем.
PM MAIL   Вверх
Петрович
Дата 25.10.2005, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Повторюсь несколько иначе. Если высказанное тобой предположение верно, то с таким сервером не сможет корректно работать ни одна серьезная программа!
Генераторы обычно используются для получения уникальных идентификаторов записей. Следовательно, при таком поведении, идентификаторы полученные в двух паралельных транзакциях совпадут. Т.е., при сохранении будем иметь гаррантированное нарушение правила уникальности ID.
Лет пять, а то и более, работаю с разными версиями IB/FB, но с таким ни разу не сталкивался.
Не обижайся, но думаю что это был косяк у твоего коллеги.
Без публичной демонстрации примера где такой эффект воспроизводится, никогда в такое не поверю.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
nnm
Дата 25.10.2005, 21:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(short)
The short keyword designates a 16-bit integer.

Цитата(int)
On 32-bit platforms, the keyword int specifies a 32-bit signed integer.

2 МихаилК: Не вводи, пожалуйста, народ в заблуждение - генераторы работают вне контекста транзакции и не зависят от версии сервера. Честное слово smile

  Вверх
МихаилК
Дата 26.10.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 24.10.2005

Репутация: нет
Всего: нет



Цитата(nnm @ 25.10.2005, 21:39)
2 МихаилК: Не вводи, пожалуйста, народ в заблуждение - генераторы работают вне контекста транзакции и не зависят от версии сервера. Честное слово smile

Наверное ты в чем то прав: столь серьезное предположение просто необходимо было подкреплять примером. К сожалению сейчас нет времени заняться исследованием данного вопроса, так что не предлагаю верить мне на слово. Я просто высказал предположение исходя из имеющихся у меня данных. Кроме того я прекрасно осознаю, что генераторы просто ОБЯЗАНЫ работать вне контекста транзакций, так что мне данный случай тоже представляется скорее всего глюком.
P.S. Если все-таки время появится, постараюсь воспроизвести пример и выложить тут (если конечно удасться узнать и найти версию билда FB, использовавшегося в предыдущий раз).
PM MAIL   Вверх
RSV
Дата 26.10.2005, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 27.6.2005

Репутация: нет
Всего: нет



Цитата
Цитата
Кроме того, по непроверенным данным (слышал краем глаза) в FB1.5.0 Classic не видно изменение значения генератора после вызова функции GEN_ID в другой транзакции, до подтверждения текущей.

Сильно сомневаюсь. Иначе, вообще теряется смысл существования генераторов. Их основная ценность в том, что они живут вне механизма транзакций.

Я извиняюсь, что вклинился в вашу беседу, но на мой вопрос о генераторах я так
и не получил ответ. Почему у меня не получается на клиенте определить
текущее значение генератора? Где моя ошибка?
PM MAIL   Вверх
Guest
Дата 26.10.2005, 17:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Объясни мне, тёмному (я не знаю VC++):
var.m_iVal - это int, адрес int или что-то ещё ?
  Вверх
Петрович
Дата 26.10.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



Цитата(RSV @ 26.10.2005, 09:06)
Почему у меня не получается на клиенте определить
текущее значение генератора? Где моя ошибка?

К сожалению, мои знания C++ не велики. В их рамках, мне кажется что все написано правильно. Хотя, не знаю что будет если возникнет ошибка при выполнении запроса - ты я смотрю вроде никак это не обрабатываешь.

Цитата(RSV @ 25.10.2005, 09:14)
Во всех статьях о генераторах описано, что таким способом
(SELECT GEN_ID(Client_gen, 0) FROM RDB$DATABASE) можно узнать текущее
значение генератора Client_gen.

Правильность этого ты можешь проверить в любой программе типа IBExpert, IBConsole, и пр.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Alex
Дата 1.11.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 7
Всего: 162





--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
syan66
Дата 4.5.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.12.2005

Репутация: нет
Всего: нет



Значит, экспериментировал как мог... По-разному-всякому.
На форме лежит 2 TIBQuery и 2 TIBTransaction. 
В IBQuery1: 'SELECT GEN_ID(CLIENT_GEN, 0) FROM RDB$DATABASE', 
IBQuery2: 'SELECT GEN_ID(CLIENT_GEN, 1) FROM RDB$DATABASE' 
Две транзакции, по одной на каждый TIBQuery для чистоты эксперимента.
Транзакции явно не стартуют и не коммитятся, DefaultAction taRollback.

Необновление значения IBQuery1.Fileds[0] при открытии/закрытии запроса 1 получилось только в случае, многократного IBQuery2.Open без Close smile

Выводы: 
1. Генераторы меняются вне контекста транзакции
2. Ошибка в вызовах GEN_ID, 1
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.