Insert Into + последующее обновление
А теперь к делу ) :
При нажатииина кнопку я в БД добавляю строку с помощью INSERT INTO.
Строка добавляется в БД, но это не отображается в самой сетке DbGrid, которая связана с этой БД...поэтому приходится делать
QueryMain.close
QueryMain.open
вот думаю, если в БД будет пара тысяч записей - это постоянное закрывание /открывание не затормозит работу ?
И как это исправить, если так ?
А также наличия индексов в полях по которым идёт выборка и сортировка.
[query]
QueryMain.close
QueryMain.open
[/query]
Для этого есть метод ReQuery (или похоже пишется)
Если запрос сложный, то используй совет el scorpio. В дополнение к нему, я порекомендую сделать следующее:
1. TDataSet.DisableControls перед обновлением данных (еще можно курсор на часики поменять);
2. TDataSet.Locate после обновления данных, чтобы вернуться на ту строку, на которой стоял пользователь
3. TDataSet.EnableControls после обновления данных
А еще лучше - привести нормальный текст обработчика, а не делать тайны там, где ее нет и быть не может.
Здесь ясновидящих нет!:d
Вот нашёл :
Метод Refresh немедленно обновляет записи источника данных формы, чтобы отобразить сделанные пользователями изменения в многопользовательской среде.
ВНИМАНИЕ Обратите внимание, что метод Refresh не выполняет отбор записей заново, то есть не формирует повторный запрос к базе данных. Отображаются только изменения, внесенные в текущий набор записей. При этом на экране не будут отображены данные, добавленные или удаленные из базы данных после последнего обновления набора записей. Чтобы выполнить новый отбор записей, следует выполнить метод Requery, о котором сказано ниже.
Метод Requery обновляет данные, служащие источником данных формы или элемента управления на активной форме. Данные обновляются путем повторного запроса к источнику данных формы или элемента управления. Таким образом, этот метод позволяет отображать текущие данные в форме или элементе управления.
Использование метода Requery предполагает выполнения одного из следующих действий:
Повторно выполняется запрос формы или элемента управления.
Выводятся все добавленные или измененные записи и убираются записи, удаленные из базовой таблицы формы или элемента управления.
Обновляются выводимые в форме или элементе управления записи в соответствии с изменением свойства Фильтр (Filter) формы.
Т.е. достаточно после каждого изменения делать Refresh, чтоды получить изменеёёные записи, и всё ??
Нежели каждый раз делать повторнывй запрос ко всей БД, что затормозит работу...
Т.е. достаточно после каждого изменения делать Refresh, чтоды получить изменеёёные записи, и всё ??
Нежели каждый раз делать повторнывй запрос ко всей БД, что затормозит работу...
А как ты думал :)
Хотя есть вариант - перейти на ADO.
Если для компонента ADOQuery (а также ADOStoredProc и ADODataSet) установить свойство LockType в Optimistic (по-умолчанию), то при изменении набора данных содержимое базы данных изменится аналогичным образом без всяких запросов Insert, Update и Delete. Проверялось неоднократно на MS Access.
Если указать значение BatchOptimistic, то обновление базы данных будет выполнятся методом BatchUpdate
И как это исправить, если так ?
Решений два:
- Забить на insert into, вставлять в тот же DataSet, что отображается в гриде
- Выяснить, поддерживается ли в SQL insert returning. Перейти на сервер, где поддерживается.
Хотя есть вариант - перейти на ADO.
Если для компонента ADOQuery (а также ADOStoredProc и ADODataSet) установить свойство LockType в Optimistic (по-умолчанию), то при изменении набора данных содержимое базы данных изменится аналогичным образом без всяких запросов Insert, Update и Delete. Проверялось неоднократно на MS Access.
Если указать значение BatchOptimistic, то обновление базы данных будет выполнятся методом BatchUpdate
А я не сказал ? :) Сорри -я итк через ADO работаю.
Дело в том, что я добавляю запись из другой таблицы. Прямого изменения данных нет, поэтому с LockType не совсемподходит.
КстатИ, Refresh не помогает, приходится через ReQuery.