Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Проблемы с ADOTable (Delphi7)

Автор: dad1969
Дата сообщения: 30.06.2006 17:04
Сорри, если это уже обсуждалось. Честно искал, не первый день тут.
Проблема в следующем:
Обращаюсь к Access через ADOTable. В базе несколко таблиц связанных через MasterSource. Если редактирование (добавление, удаление) осуществляется через Grid, то все проходит нормально. Если же пытаюсь
ADOTable1.Append;
ADOTable1.FieldByName('NAME').AsString:=NewValue;
ADOTable1.Post;
ругается на закрытый Dataset. Хорошо, добавляю перед этим
ADOTable1.Active:=True;
ругаться перестает, но в Grid новая строка не появляется. В базу при этом новая запись благополучно попадает и после перезапуска программы отображается. Можно ли как-то все-же сделать это через Append и чем это отличается от того, что делает Grid? На Query переходить не хочу, т.к. Table удобно связывается через MasterSource что избавляет от отслеживания цепочки по всем подчиненным таблицам при работе с базой.
Автор: dyr farot
Дата сообщения: 30.06.2006 18:22
а при чем тут ADOTable1.Active
тебе же про Dataset говорили.
а чтобы данные появились и в сетке -- нужно ее Dataset переоткрыть (можно Requery попробовать)
Автор: DroN_S
Дата сообщения: 01.07.2006 19:41
dad1969
Сделай после добавления записи в ьаблицу обновление сетки

Код:
DBGrid.Refresh;
Автор: dad1969
Дата сообщения: 03.07.2006 10:34
DroN_S

Цитата:
обновление сетки

Да уж это я разумеется пробовал. Что-то тут глубже сидит. А насчет SQL - спасибо за совет выучить то что знаю. Так что уточняю - на Query не хочу переходить в данном проекте. Здесь удобнее так. Но дело даже не в этом. Хочется разобраться в причинах такого поведения. Ведь если есть ошибки в одном компоненте ADO то где гарантия что их нет в других? И есть ли такое в более свежих версиях? Или все-так что-то не так в приведенном мной коде и что касается именно ADO я что-то не учитываю. До сих пор я усиленно отбивался от использования Access в качестве хранилища данных, а вот сейчас пришлось. Так что предваряю попытки посоветовать использовать что-либо другое. Не я так захотел. До того делал проект на MySQL (не зная SQL ) и горя не знал. Но сейчас вот так.

dyr farot

Цитата:
а при чем тут ADOTable1.Active
тебе же про Dataset говорили.

TADOTable is a dataset component that encapsulates a table accessed through an ADO data store. (Visual Component Library Reference Help)
Без комментариев.
Автор: dyr farot
Дата сообщения: 03.07.2006 14:38
нету в компонентах ошибки.
это просто неправильная работа с компонентами.
Автор: dad1969
Дата сообщения: 03.07.2006 16:24
dyr farot

Цитата:
нету в компонентах ошибки.
это просто неправильная работа с компонентами.

Ну а в чем неправильная? Вопрос то так и ставится - если неправильная, то помогите исправить. А насчет того что нет ошибок в компонентах - утверждение смелое, особенно с учетом того, что как минимум один фикс к Delphi7 выходил. Ну и напоследок - суррогатное решения я все-таки нашел методом тыка. Если вместо ADOTable1 написать DBGRid1.DataSource.DataSet (что указывает на тот же самый ADOTable1) то все великолепно работает. Может все-таки кто-нибудь сталкивался с такой проблемой и знает в чем собака зарыта?
Автор: RffR255
Дата сообщения: 03.07.2006 18:22
Таже херня, я делаю в таком случае так:

ADOTable1.Active:=False;
ADOTable1.Active:=True;

Конечно не красиво, зато работает.

Насчет SQL. Выполняю запрос на чтение из SQL Server 2000 (физически на другом ПК) все норм, данные читаются. Выдергиваю сетевой провод, еще раз читаю, все опять прекрасно читается. Где-то кэшируется?
Автор: dyr farot
Дата сообщения: 03.07.2006 18:30

Цитата:

у и напоследок - суррогатное решения я все-таки нашел методом тыка. Если вместо ADOTable1 написать DBGRid1.DataSource.DataSet

а теперь прочитай последнюю строку моего поста...


Цитата:

А насчет того что нет ошибок в компонентах - утверждение смелое, особенно с учетом того, что как минимум один фикс к Delphi7 выходил.

я говорил не о компонентах ВООБЩЕ, а говорил о компонентах ADO (TADOTAble в частности)
Автор: Sandmansss
Дата сообщения: 04.07.2006 08:32
Существуют моного вещей чудесных и непонятных )))
Я много раз сталкивался с непонятным для меня поведением компонентов и описанных функций.
Если ты нашел как обойти данную проблему, то оставь ты этот ADO. Через время случайно всплывет и узнаешь...
Автор: dad1969
Дата сообщения: 04.07.2006 10:58
RffR255
Active:=False
Active:=True
спасибо, пробовал, не сработало. А насчет MS SQL Server - сорри, не знаю. Язык SQL и MS SQL Server не совсем одно и то же. Вопрос в клиентской части. Подозреваю что ADO действительно кеширует данные ибо на время навигации по данным датасет автоматически закрывается. Видимо поэтому и не обновляется информация в гриде, кроме как если с датасетом работать указывая его через грид. Черт его знает. Будет время - поковыряюсь в компонентах.

dyr farot
А теперь по-русски:
Компонет ADOTable является датасетом. DataSet и ADOTable (или Table, Query и т.п.) - это одно и то же. Обратиться к датасету грида и к тэйблу напрямую - одно и то же. DBGrid.DataSource.DataSet = ADOTable. Теперь понятно?

Цитата:
я говорил не о компонентах ВООБЩЕ, а говорил о компонентах ADO (TADOTAble в частности)

Опять пальцем в небо. Посмотри http://www.delphiplus.org/readme/delphi_71_update.html. ADO в списке пофиксенных компонентов там есть. Уверен что они вычистили все ошибки? Я - нет.
Автор: multisync777
Дата сообщения: 05.08.2006 15:18
Увы, проблема с глючностью адокомпонентов стара как мир.. На сегодняшний день рекомендации - пользоваться ADODataSet, или в крайнем случае Adoquery.
Adotable - самый глючный. личные наблюдения+опыт друзей
Автор: KRS545
Дата сообщения: 06.08.2006 11:33
Уже 5 лет использую ADO из Delphi и ни каких особых проблем нет.
Работаю с MS SQL и Sybase ASE. Под MS стандартный OLE DB драйвер, под Sybase OLE DB от Sybase'а.

dad1969
Append это конечно здорово.
но лучше в Query засунуть 'Insert into Table(Name) values(NewValue)'
и переоткрыть Dataset
Автор: MbIJIO
Дата сообщения: 27.04.2009 09:49
подскажите пожалуйста, как изменить адотаблицу при помощи едита(такого задание).
извиняюсь что не по теме.

Страницы: 1

Предыдущая тема: Конечный распознающий автомат


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.