Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Insert Into + последующее обновление

5.2K
28 февраля 2007 года
SerMax
96 / / 04.11.2006
Привет всем ! С наступающей весной !
А теперь к делу ) :

При нажатииина кнопку я в БД добавляю строку с помощью INSERT INTO.
Строка добавляется в БД, но это не отображается в самой сетке DbGrid, которая связана с этой БД...поэтому приходится делать

QueryMain.close
QueryMain.open

вот думаю, если в БД будет пара тысяч записей - это постоянное закрывание /открывание не затормозит работу ?
И как это исправить, если так ?
309
01 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Всё зависит от того, сколько информации извлекается, то есть от числа полей (в операторе SELECT) и числа записей (в операторе WHERE).
А также наличия индексов в полях по которым идёт выборка и сортировка.

[query]
QueryMain.close
QueryMain.open
[/query]
Для этого есть метод ReQuery (или похоже пишется)
302
01 марта 2007 года
Sagittarius
648 / / 12.04.2003
Можешь попробовать воспользоваться методами Insert, Post.

Если запрос сложный, то используй совет el scorpio. В дополнение к нему, я порекомендую сделать следующее:
1. TDataSet.DisableControls перед обновлением данных (еще можно курсор на часики поменять);
2. TDataSet.Locate после обновления данных, чтобы вернуться на ту строку, на которой стоял пользователь
3. TDataSet.EnableControls после обновления данных
5.2K
01 марта 2007 года
SerMax
96 / / 04.11.2006
Цитата: mihali4
QueryMain.Refresh;
А еще лучше - привести нормальный текст обработчика, а не делать тайны там, где ее нет и быть не может.
Здесь ясновидящих нет!:d



Вот нашёл :

Метод Refresh немедленно обновляет записи источника данных формы, чтобы отобразить сделанные пользователями изменения в многопользовательской среде.
ВНИМАНИЕ Обратите внимание, что метод Refresh не выполняет отбор записей заново, то есть не формирует повторный запрос к базе данных. Отображаются только изменения, внесенные в текущий набор записей. При этом на экране не будут отображены данные, добавленные или удаленные из базы данных после последнего обновления набора записей. Чтобы выполнить новый отбор записей, следует выполнить метод Requery, о котором сказано ниже.



Метод Requery обновляет данные, служащие источником данных формы или элемента управления на активной форме. Данные обновляются путем повторного запроса к источнику данных формы или элемента управления. Таким образом, этот метод позволяет отображать текущие данные в форме или элементе управления.
Использование метода Requery предполагает выполнения одного из следующих действий:
Повторно выполняется запрос формы или элемента управления.
Выводятся все добавленные или измененные записи и убираются записи, удаленные из базовой таблицы формы или элемента управления.
Обновляются выводимые в форме или элементе управления записи в соответствии с изменением свойства Фильтр (Filter) формы.


Т.е. достаточно после каждого изменения делать Refresh, чтоды получить изменеёёные записи, и всё ??
Нежели каждый раз делать повторнывй запрос ко всей БД, что затормозит работу...

309
02 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:

Т.е. достаточно после каждого изменения делать Refresh, чтоды получить изменеёёные записи, и всё ??
Нежели каждый раз делать повторнывй запрос ко всей БД, что затормозит работу...


А как ты думал :)

Хотя есть вариант - перейти на ADO.
Если для компонента ADOQuery (а также ADOStoredProc и ADODataSet) установить свойство LockType в Optimistic (по-умолчанию), то при изменении набора данных содержимое базы данных изменится аналогичным образом без всяких запросов Insert, Update и Delete. Проверялось неоднократно на MS Access.
Если указать значение BatchOptimistic, то обновление базы данных будет выполнятся методом BatchUpdate

10
02 марта 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: SerMax
вот думаю, если в БД будет пара тысяч записей - это постоянное закрывание /открывание не затормозит работу ?
И как это исправить, если так ?


Решений два:

  • Забить на insert into, вставлять в тот же DataSet, что отображается в гриде
  • Выяснить, поддерживается ли в SQL insert returning. Перейти на сервер, где поддерживается.
5.2K
02 марта 2007 года
SerMax
96 / / 04.11.2006
Цитата: el scorpio
А как ты думал :)

Хотя есть вариант - перейти на ADO.
Если для компонента ADOQuery (а также ADOStoredProc и ADODataSet) установить свойство LockType в Optimistic (по-умолчанию), то при изменении набора данных содержимое базы данных изменится аналогичным образом без всяких запросов Insert, Update и Delete. Проверялось неоднократно на MS Access.
Если указать значение BatchOptimistic, то обновление базы данных будет выполнятся методом BatchUpdate



А я не сказал ? :) Сорри -я итк через ADO работаю.
Дело в том, что я добавляю запись из другой таблицы. Прямого изменения данных нет, поэтому с LockType не совсемподходит.
КстатИ, Refresh не помогает, приходится через ReQuery.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог