Цель темы: собирать воедино все возникающе вопросы здесь, а не в отдельных темах. у меня такая ситуация: программа на delphi есть база данных Access. там таблицы и запросы. к не подключаюсь через ADO Connetct (Microsoft.Jet.OLEDB.4.0)/ADO dataset. Запрос - набор полей из нескольких таблиц (сведенныых воедино) когда я работаю с таблицами - то удаление/изменения/создание записей сразу же отображаеться в DBGrid, назначенных на отображение содержания этих таблиц. а вот когда работаю с запросами (например удалаю запись из таблицы) - то DBGrid, назначенный на отображение запроса, как бы замораживаеться и не отображает внесенных изменений. только если полностью перезагружу программу. В БД все изменяеться отлично без ошибок (вроде), по крайнее мере в таблице запись удалаеться и запрос обновляеться методы DBGrid типа Refresh, Update не помогают. и не могу понять в чем причина.... и как исправить.....?
возможно нужно использовать динамические свойства рекордсета для запроса из нескольких таблиц http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprodynuniquetable.asp http://msdn.microsoft.com/library/d...ry/en-us/ado270/htm/mdprodynresynccommand.asp
Гость g100m вот-вот правильное название. я не профессионал в программировании, представляю что такое транзакции, но вроде не использовал, если они только автоматически не включаются... можно подробнее? pegas спсб, как вариант, мне нужну было чтобы в DataSet были данные из двух таблиц, но никак. я сделал запросом в самом аксесе и подключался к нему
почему Вы вызываете Refresh у TDBGrid? попробуйте закрыть и заново открыть вопрос с select-ом. g100m, "Не используйте транзакции или измените изоляцию до сериализации." ну и ну! в школу.
AlTk потому что думаю, что раз в БД все впорядке, то дело в программе (моей). у меня есть ADOConnect, ADODataSet, DataSourse и DBGrid. я еще пробовал выключать и снова включать ADODataSet - тоже не помогло...
1777, "... то дело в программе (моей)... " именно так. грубо говоря, у Вас есть клиент и есть сервер. на клиенте видна копия данных сервера, доставленная запросом select на клиента. в это время Вы выполняете другой запрос, который изменяет данные сервера. заметьте, не копию данных, расположенных на клиенте, а именно данные на сервере. для того, чтобы опять получить согласованный результат на клиенте и на сервере, Вам нужно заново выполнить запрос с select, который обновит копию данных на клиенте.
Он вернет тот же самый набор данных если транзакция, в которой исполнился предыдущий запрос (на модификацию), не завершилась. Скорее всего у компонентов, которые Вы используете, есть свойства регулирующие границы транзакции. Или, может быть, специальный невизуальный компонент для обработки транзакций.
HorstWessel Если он хоть сколько нибудь шарит в программировании, то не будет устраивать взаимодействие с пользователем в транзакции.
Компоненты самые стандартные из самого Delphi7. Ничего своего не выдумавыл, просто назначал через свойства станадартных компонентов все связи: ADOConnection - ADODataSet - DataSourse - DBGrid.
AlTk В школах есть учение об изоляции транзакций? g100m добавил [date]1118260623[/date]: http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_21385663.html http://delphi.about.com/od/database/l/aa010202a.htm Эх, программисты ...
1777, Вы сделали так, как я посоветовал или нет? g100m, есть. там говорят, что транзакции нужно использовать всегда, а сериализацию лучше никогда в жизни не использовать. и вообще, причем здесь, в случае 1777, транзакции???
стандарт SQL-92. уровень изоляции "Read uncommitted", имеет место быть: "dirty read" (грязное чтение), "Nonrepeatable read" (неповторяемое чтение), "Phantom" (фантомы) ПС. ну это я так, для примера привел.
стандарт ANSI SQL: read uncommited, read commited, repeatable read, serializable. «Read uncommitted» принесет человеку в три раза больше проблем, чем у него до этого было
хм, g100m, Вы внимательно читаете сообщения? где я советовал "человеку" использовать этот уровень изоляции??? ПС. Вы, что, до сих пор так и не поняли, что у "человека" проблема _совсем_ не в транзакциях??? специально для вас повторю вопрос, "и вообще, причем здесь, в случае 1777, транзакции???" AlTk добавил [date]1118303011[/date]: HorstWessel, тогда по-Вашему: 1. зависит не только от уровня изоляции, но и еще от чего-то; тогда ответьте мне, от чего зависят "Dirty read", "Nonrepeatable read" и "Phantom"? 2. иногда транзакции не нужно использовать; когда, приведите мне пример когда транзакции не надо использовать? когда нужно отказаться от свойств ACID? 3. в случае 1777 вся проблема в транзакциях. какая у 1777 проблема в транзакциях? у него русским языком написано " ... В БД все изменяеться отлично без ошибок (вроде), по крайнее мере в таблице запись удалаеться ... ". понимаете. он это смог увидеть. транзакция уже закончилась, а "... DBGrid, назначенный на отображение запроса, как бы замораживаеться и не отображает внесенных изменений. только если полностью перезагружу программу. ..." "Боже мой, и в какой школе учат таких тупезней! " а вы, похоже, самоучка ПС. g100m, для справки. вобще говоря, говорить ANSI SQL не совсем правильно. имеет смысл говорить ANSI SQL с указанием года.
AlTk Это чего-то есть граница транзакции. Даже если уровень изоляции Read Uncommited, то такие проблемы как Dirty read и т.д возникают когда транзакции "пересекают" друг-друга. Транзакции нужно использовать всегда. Более того, работая с сервером баз данных вам этого не избежать даже если бы этого хотелось. мне не понятна ваша фраза: "вообще, причем здесь, в случае 1777, транзакции", при этом вы говорите об уровне изоляции... Это одна из возможных причин. Видит он изменения таблиц в рамках одной и той же транзакции, или они разные? От него ответа не было. Комитит-ли он транзакцию пока тоже не ясно. Разве это не "перезагрузка" программы? Если бы он использовал что-то типа буферизованных изменений то, все равно, после "перезагрузки" источника данных буфера должны были бы обновиться.
мне уже это порядком поднадоело. 1. какой такой "граница транзакции"? "dirty read" зависит _только_ от уровня изоляции и имеет место быть при уровне изоляции "Read uncommitted". каждый следующий уровень изоляции уменьшает количество возможных проблем. все. 2. "Транзакции нужно использовать всегда." Вы же только что удивлялись этому выражению! "работая с сервером баз данных вам этого не избежать" ох, боже мой! хотя избежать можно , правда не для всего. 3. что там не ясно? говоря Вашей терминологией он видит изменения в "рамках разных транзакций", так как перезапуск программы это уж наверняка разные транзакции, а в рамках одной транзакции он уж наверняка должен был увидеть изменения. я еще раз спрошу, "причем здесь транзакции"? ПС. включение-выключение ADODataSet (непонятно, что это такое) конечно не является перезагрузкой, так как в случае перезагрузки изменяются еще и ADOConnection, DataSourse и DBGrid. ППС. кстати, может за "тупезней" все-таки извинитесь?
AlTk А почему вы тупезень пишите в кавычках? Все еще сомневаетесь? Ну тогда мы идет к вам: Могу еще сделать Вам экскурсию по вашим же изречениям. Обязательно это сделаю если вы еще раз пошлете кого-нибудь в школу. P.S. Ксати, некотые ухитряются и с серверами баз данных уможить службу транзакций на ноль. При этом всякий раз придумывают свою службу транзакций! И самое интересное что все они математики. Похоже на закономерность.
"Ну тогда мы идет к вам:" а что Вам не понравилось? "Ксати, некотые ухитряются и с серверами баз данных уможить службу транзакций на ноль. При этом всякий раз придумывают свою службу транзакций! И самое интересное что все они математики. Похоже на закономерность." это Вы вообще к чему сказали? ПС. пожалуй я все-таки пошлю вас в школу еще раз, дабы Вам там рассказали про транзакции.
AlTk Да ваще слов нет. И кроме как этим: не вежество свое прикрыть нечем? Не смешите народ, г-н модератор.
послушайте, уважаемый. Вы либо отвечаете на вопрос, либо такие Ваши сообщения я буду удалять. ПС. слово "невежество" пишется вместе.
AlTk нашел метод Requery в ADODataSet - не помогло тут такие споры, я специальне сейчас посмотрю - в рамках одной или не одной транзакции и (не)подтвержу изменения в таблице Access 1777 добавил [date]1118495732[/date]: Проверил: 1) запускаю свою программу 2) открываю БД в аксесе 3) изменяю данные при помощи программы 4) вижу обновление запиписи в аксесе 5) не вижу обновления в DBGrid в программе. Транзакция одна, прошла. 6) перезагружаю прогу 7) вижу изменения и самой проге в DBGrid
OK. Тогда можно попробовать обновить элементы управления. Попробуйте так dataset.disableControls(); dataset.refresh(); // может requery() dataset.enableControls(); В этом случае все элемнты управления подключенные к dataset должны обновиться. Может еще после refresh() (но до enableControls()) понадобиться поставить курсор в прежнее место.
1777, "Requery" все-таки вы сделали не совсем так, как я советовал. выполните вот что: ADODataSet.Close; ADODataSet.Open; ПС. если не получится, будем дальше думать;
HorstWessel не, не помогло AlTk тоже не помогло значит надо по-другому... есть же какой-нить способ чтобы в DataSet выбору из нескольких таблиц, думаю совет pegas пожет, надо только разобраться... 1777 добавил [date]1118752752[/date]: либо еще по-другому - надо сделать обычную таблицу и подключаться к ней, а не к запросу (с таблицами ведь все работает), только продумать структуру...