Delphi Редактировать DBGrid и обновлять базу данных в режиме только для чтения?

Итак, у меня есть DBGrid, заполненный SQL-запросом. Я хочу, чтобы запрос был только для чтения, чтобы таблица не блокировалась во время работы программы. Проблема в том, что когда он установлен только для чтения, я вообще не могу редактировать таблицу.

Что я хочу сделать, так это иметь возможность редактировать поля в DBGrid, находясь в режиме только для чтения, а затем сразу обновлять его, чтобы мне не приходилось оставлять соединение открытым.

Я не совсем уверен, как это сделать. В DBGrid нет события OnChange, поэтому я не могу просто запускать запрос на обновление каждый раз при изменении ячейки.

У кого-нибудь есть идеи?


person user1970794    schedule 24.01.2013    source источник
comment
Почему таблица будет заблокирована, если вы оставите соединение открытым? Это не должно.   -  person Sertac Akyuz    schedule 24.01.2013


Ответы (1)


Именно по этой причине был написан TClientDataSet. Это позволяет вам делать моментальные снимки данных, сохранять их в памяти, обновлять их, как если бы это был фактический набор данных, а затем легко применять эти обновления обратно к исходной базе данных.

здесь есть руководство, которое не так уж плохо. Вы можете найти еще один на Scalabium и series на сайте Embarcadero, которую Кэри Дженсен позже превратил в книгу (вы можете найти ее на Amazon — ссылки под рукой нет).

person Ken White    schedule 24.01.2013
comment
Я уже сделал массу других вещей, которые используют DBGrid и Query. Если бы я использовал TClientDataSet, разве мне не пришлось бы все переделывать? Я действительно не хочу этого делать. - person user1970794; 24.01.2013
comment
Нет. Это вопрос изменения набора данных и чтения из запроса в ClientDataSet. Я преобразовал приложение, которое интенсивно использовало реальную базу данных для хранения строк ввода данных, для использования вместо этого ClientDataSet примерно за час, чтобы оно работало в автономном режиме (в портфеле). - person Ken White; 24.01.2013
comment
Например, у меня есть кнопка, которая позволяет вам добавлять новые строки, несмотря на то, что вы открываете новый запрос и закрываете его после выполнения запроса. - person user1970794; 24.01.2013
comment
В этом случае вам не нужно будет делать новый запрос для добавления строки; вы просто делаете Insert в CDS. Пожалуйста, найдите время, чтобы просмотреть ссылку, которую я предоставил для учебника, вместо того, чтобы задавать дополнительные вопросы здесь, в комментариях. :-) - person Ken White; 24.01.2013
comment
Также кажется, что если у вас массивная база данных, то TClientDataSet будет плохой идеей. Я говорю о том, как бы вы поступили с большой многотабличной многопользовательской базой данных. - person user1970794; 24.01.2013
comment
Будете ли вы читать размещенные мной ссылки? Я уже говорил, что TClientDataSet — это точное решение, разработанное для вашей проблемы, но я не собираюсь переписывать несколько руководств и документации, на которые я уже ссылался, чтобы попытаться убедить вас. :-) Другие сделали работу намного лучше, чем я, и у них гораздо больше места для ответов, чем у SO. БД, о которой я упоминал при переходе на CDS, вставляет тысячи строк в день в БД, содержащую около 2 миллионов строк, которая подключена к нескольким десяткам других таблиц, и работает просто отлично. - person Ken White; 24.01.2013