1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Вопросы по программированию

Тема в разделе "Программирование", создана пользователем 1777, 05.06.05.

  1. 1777

    1777 Активный участник

    6.532
    12
    Цель темы: собирать воедино все возникающе вопросы здесь, а не в отдельных темах.

    у меня такая ситуация:
    программа на delphi
    есть база данных Access. там таблицы и запросы.
    к не подключаюсь через ADO Connetct (Microsoft.Jet.OLEDB.4.0)/ADO dataset.
    Запрос - набор полей из нескольких таблиц (сведенныых воедино)
    когда я работаю с таблицами - то удаление/изменения/создание записей сразу же отображаеться в DBGrid, назначенных на отображение содержания этих таблиц.
    а вот когда работаю с запросами (например удалаю запись из таблицы) - то DBGrid, назначенный на отображение запроса, как бы замораживаеться и не отображает внесенных изменений. только если полностью перезагружу программу.
    В БД все изменяеться отлично без ошибок (вроде), по крайнее мере в таблице запись удалаеться и запрос обновляеться
    методы DBGrid типа Refresh, Update не помогают. и не могу понять в чем причина....
    и как исправить.....?
     
  2. Гость

    Гость Гость

    Проверь контекст транзакции.
     
  3. g100m

    g100m Участник

    420
    0
    Ваша проблема - phantom rows.
    Не используйте транзакции или измените изоляцию до сериализации.
     
  4. pegas

    pegas Участник

    311
    0
  5. 1777

    1777 Активный участник

    6.532
    12
    Гость
    g100m

    :) вот-вот правильное название.
    я не профессионал в программировании, представляю что такое транзакции, но вроде не использовал, если они только автоматически не включаются...
    можно подробнее?
    pegas
    спсб, как вариант, мне нужну было чтобы в DataSet были данные из двух таблиц, но никак.
    я сделал запросом в самом аксесе и подключался к нему
     
  6. AlTk

    AlTk Читатель

    10.699
    0
    почему Вы вызываете Refresh у TDBGrid?
    попробуйте закрыть и заново открыть вопрос с select-ом.

    g100m,
    "Не используйте транзакции или измените изоляцию до сериализации."
    ну и ну!
    в школу.
     
  7. jek

    jek Активный участник

    5.733
    0

    Да нет его проблема в приложении. Так сказать Client side.
     
  8. 1777

    1777 Активный участник

    6.532
    12
    AlTk

    потому что думаю, что раз в БД все впорядке, то дело в программе (моей). у меня есть ADOConnect, ADODataSet, DataSourse и DBGrid.
    я еще пробовал выключать и снова включать ADODataSet - тоже не помогло...
     
  9. AlTk

    AlTk Читатель

    10.699
    0
    1777,
    "... то дело в программе (моей)... "
    именно так.
    грубо говоря, у Вас есть клиент и есть сервер.
    на клиенте видна копия данных сервера, доставленная запросом select на клиента.
    в это время Вы выполняете другой запрос, который изменяет данные сервера. заметьте, не копию данных, расположенных на клиенте, а именно данные на сервере.
    для того, чтобы опять получить согласованный результат на клиенте и на сервере, Вам нужно заново выполнить запрос с select, который обновит копию данных на клиенте.
     
  10. HorstWessel

    HorstWessel Активный участник

    1.585
    0

    Он вернет тот же самый набор данных если транзакция, в которой исполнился предыдущий запрос (на модификацию), не завершилась.

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

    jek Активный участник

    5.733
    0
    HorstWessel

    Если он хоть сколько нибудь шарит в программировании, то не будет устраивать взаимодействие с пользователем в транзакции.
     
  12. AlTk

    AlTk Читатель

    10.699
    0
    "... Он вернет тот же самый набор данных ..."
    все зависит от уровня изоляции. ;)
     
  13. 1777

    1777 Активный участник

    6.532
    12
    Компоненты самые стандартные из самого Delphi7. Ничего своего не выдумавыл, просто назначал через свойства станадартных компонентов все связи: ADOConnection - ADODataSet - DataSourse - DBGrid.
     
  14. g100m

    g100m Участник

    420
    0
  15. AlTk

    AlTk Читатель

    10.699
    0
    1777,
    Вы сделали так, как я посоветовал или нет?

    g100m,
    есть. там говорят, что транзакции нужно использовать всегда, а сериализацию лучше никогда в жизни не использовать.
    и вообще, причем здесь, в случае 1777, транзакции???
     
  16. g100m

    g100m Участник

    420
    0
    AlTk
    Странно.

    Скажите тогда, какую изоляцию вы имели в виду
     
  17. AlTk

    AlTk Читатель

    10.699
    0
    стандарт SQL-92.
    уровень изоляции "Read uncommitted", имеет место быть: "dirty read" (грязное чтение), "Nonrepeatable read" (неповторяемое чтение), "Phantom" (фантомы)

    ПС. ну это я так, для примера привел.
     
  18. g100m

    g100m Участник

    420
    0
    стандарт ANSI SQL: read uncommited, read commited, repeatable read, serializable.
    «Read uncommitted» принесет человеку в три раза больше проблем, чем у него до этого было :)
     
  19. HorstWessel

    HorstWessel Активный участник

    1.585
    0
    AlTk



    :confused: :confused: :confused:

    Боже мой, и в какой школе учат таких тупезней! Это математика ВолГУ?
     
  20. AlTk

    AlTk Читатель

    10.699
    0
    хм, g100m, Вы внимательно читаете сообщения? где я советовал "человеку" использовать этот уровень изоляции???

    ПС. Вы, что, до сих пор так и не поняли, что у "человека" проблема _совсем_ не в транзакциях???
    специально для вас повторю вопрос, "и вообще, причем здесь, в случае 1777, транзакции???"

    AlTk добавил [date]1118303011[/date]:
    HorstWessel,
    тогда по-Вашему:
    1. зависит не только от уровня изоляции, но и еще от чего-то;
    тогда ответьте мне, от чего зависят "Dirty read", "Nonrepeatable read" и "Phantom"?

    2. иногда транзакции не нужно использовать;
    когда, приведите мне пример когда транзакции не надо использовать? когда нужно отказаться от свойств ACID?

    3. в случае 1777 вся проблема в транзакциях.
    какая у 1777 проблема в транзакциях? у него русским языком написано " ... В БД все изменяеться отлично без ошибок (вроде), по крайнее мере в таблице запись удалаеться ... ". понимаете. он это смог увидеть. транзакция уже закончилась, а "... DBGrid, назначенный на отображение запроса, как бы замораживаеться и не отображает внесенных изменений. только если полностью перезагружу программу. ..."

    "Боже мой, и в какой школе учат таких тупезней! "
    а вы, похоже, самоучка ;)

    ПС. g100m, для справки.
    вобще говоря, говорить ANSI SQL не совсем правильно. имеет смысл говорить ANSI SQL с указанием года.
     
  21. HorstWessel

    HorstWessel Активный участник

    1.585
    0
    AlTk


    Это чего-то есть граница транзакции. Даже если уровень изоляции Read Uncommited, то такие проблемы как Dirty read и т.д возникают когда транзакции "пересекают" друг-друга.


    Транзакции нужно использовать всегда. Более того, работая с сервером баз данных вам этого не избежать даже если бы этого хотелось. мне не понятна ваша фраза: "вообще, причем здесь, в случае 1777, транзакции", при этом вы говорите об уровне изоляции...:confused:


    Это одна из возможных причин. Видит он изменения таблиц в рамках одной и той же транзакции, или они разные? От него ответа не было. Комитит-ли он транзакцию пока тоже не ясно.

    Разве это не "перезагрузка" программы? Если бы он использовал что-то типа буферизованных изменений то, все равно, после "перезагрузки" источника данных буфера должны были бы обновиться.
     
  22. AlTk

    AlTk Читатель

    10.699
    0
    мне уже это порядком поднадоело.

    1. какой такой "граница транзакции"? "dirty read" зависит _только_ от уровня изоляции и имеет место быть при уровне изоляции "Read uncommitted". каждый следующий уровень изоляции уменьшает количество возможных проблем. все.

    2. "Транзакции нужно использовать всегда."
    Вы же только что удивлялись этому выражению!

    "работая с сервером баз данных вам этого не избежать"
    ох, боже мой! хотя избежать можно :), правда не для всего.

    3. что там не ясно?
    говоря Вашей терминологией он видит изменения в "рамках разных транзакций", так как перезапуск программы это уж наверняка разные транзакции, а в рамках одной транзакции он уж наверняка должен был увидеть изменения.

    я еще раз спрошу, "причем здесь транзакции"?

    ПС. включение-выключение ADODataSet (непонятно, что это такое) конечно не является перезагрузкой, так как в случае перезагрузки изменяются еще и ADOConnection, DataSourse и DBGrid. :)

    ППС. кстати, может за "тупезней" все-таки извинитесь?
     
  23. HorstWessel

    HorstWessel Активный участник

    1.585
    0
    AlTk

    А почему вы тупезень пишите в кавычках? Все еще сомневаетесь? Ну тогда мы идет к вам:


    Могу еще сделать Вам экскурсию по вашим же изречениям. Обязательно это сделаю если вы еще раз пошлете кого-нибудь в школу.

    P.S.
    Ксати, некотые ухитряются и с серверами баз данных уможить службу транзакций на ноль. При этом всякий раз придумывают свою службу транзакций! И самое интересное что все они математики. :confused: Похоже на закономерность.
     
  24. AlTk

    AlTk Читатель

    10.699
    0
    "Ну тогда мы идет к вам:"
    а что Вам не понравилось?:)

    "Ксати, некотые ухитряются и с серверами баз данных уможить службу транзакций на ноль. При этом всякий раз придумывают свою службу транзакций! И самое интересное что все они математики. Похоже на закономерность."
    это Вы вообще к чему сказали?

    ПС. пожалуй я все-таки пошлю вас в школу еще раз, дабы Вам там рассказали про транзакции.
     
  25. HorstWessel

    HorstWessel Активный участник

    1.585
    0
    AlTk

    Да ваще слов нет.

    И кроме как этим:

    не вежество свое прикрыть нечем? Не смешите народ, г-н модератор.
     
  26. AlTk

    AlTk Читатель

    10.699
    0
    послушайте, уважаемый.
    Вы либо отвечаете на вопрос, либо такие Ваши сообщения я буду удалять.

    ПС. слово "невежество" пишется вместе. :)
     
  27. 1777

    1777 Активный участник

    6.532
    12
    AlTk

    нашел метод Requery в ADODataSet - не помогло :)
    тут такие споры, я специальне сейчас посмотрю - в рамках одной или не одной транзакции и (не)подтвержу изменения в таблице Access

    1777 добавил [date]1118495732[/date]:
    Проверил:
    1) запускаю свою программу
    2) открываю БД в аксесе
    3) изменяю данные при помощи программы
    4) вижу обновление запиписи в аксесе
    5) не вижу обновления в DBGrid в программе.
    Транзакция одна, прошла.
    6) перезагружаю прогу
    7) вижу изменения и самой проге в DBGrid
     
  28. HorstWessel

    HorstWessel Активный участник

    1.585
    0


    OK. Тогда можно попробовать обновить элементы управления. Попробуйте так
    dataset.disableControls();
    dataset.refresh(); // может requery()
    dataset.enableControls();

    В этом случае все элемнты управления подключенные к dataset должны обновиться. Может еще после refresh() (но до enableControls()) понадобиться поставить курсор в прежнее место.
     
  29. AlTk

    AlTk Читатель

    10.699
    0
    1777,
    "Requery"
    все-таки вы сделали не совсем так, как я советовал.
    выполните вот что:
    ADODataSet.Close;
    ADODataSet.Open;

    ПС. если не получится, будем дальше думать;
     
  30. 1777

    1777 Активный участник

    6.532
    12
    HorstWessel

    не, не помогло :)

    AlTk

    тоже не помогло :)

    значит надо по-другому... есть же какой-нить способ чтобы в DataSet выбору из нескольких таблиц, думаю совет pegas пожет, надо только разобраться...

    1777 добавил [date]1118752752[/date]:
    либо еще по-другому - надо сделать обычную таблицу и подключаться к ней, а не к запросу (с таблицами ведь все работает), только продумать структуру... :)