|
Oleg
|
|
Как обновить базу данных?12.04.2007, 07:50. Показов 4752. Ответов 23
Метки нет (Все метки)
Использую DataGrid (OLEDB) и ADOBD
С помощью запроса изменяю днные в Access-совской таблице, а в DataGrid изменения не видны. Requery и Refresh не помогают. Подозрение на буферизацию данных. Так вот как сказать, что надо сбросить буфер на винт, и показать в DataGrid? Заранее благодарен. |
|
| 12.04.2007, 07:50 | |
|
Ответы с готовыми решениями:
23
Как перенаправить в другую базу данных при вызове конкретной строки из таблицы другой базы данных? Как создавать базу данных? |
|
0 / 0 / 0
Регистрация: 06.05.2007
Сообщений: 11
|
|
| 06.05.2007, 09:26 | |
|
Надо закрыть базу в программе о открыть снова.
0
|
|
|
vital
|
|
| 09.05.2007, 08:27 | |
|
попробуй
recordset.resync |
|
|
Oleg
|
|
| 09.05.2007, 08:37 | |
|
Все дело в том, что обновление идет по команде
UpDate после которой объект остается закрытым поэтому ни один метод не работает и выдает ошибку, что объект закрыт. Я тут попробовал его снова открыть командой Select и снова закрыть. Фокус удался, обновления прошли, но все это криво как-то и не красиво (
|
|
|
vital
|
|
| 09.05.2007, 08:57 | |
|
обьясни поподробнее
|
|
|
Oleg
|
|
| 09.05.2007, 11:48 | |
|
Set Doc = CreateObject('ADODB.Recordset')
Doc.ActiveConnection = dbClient StrSQL = 'UPDATE Documents SET 'Date_Document='' & Date_Document & ' WHERE (CodDocumenta = ' & CodDocument & ')' Doc.Open StrSQL Set Doc = Nothing '*************************************** ********** ' Это надо для записи буфера, иначе изменения не видны Set Doc = CreateObject('ADODB.Recordset') Doc.ActiveConnection = dbClient StrSQL = 'SELECT * FROM Documents' Doc.Open StrSQL Debug.Print Doc('Payer') Doc.Close Set Doc = Nothing '*************************************** ********** ' А это команда перечитывает наш DateGred ListDocument.Adodc1.Refresh Так вот хотелось бы заменить дополнительный Select |
|
|
Mavr
|
|
| 09.05.2007, 14:20 | |
|
Если я правильно понял, то у тебя на форме есть DataGrid и ADO Data Control, который поставляет DataGrid'у Recordset, и плюс ты еще из кода меняешь информацию в БД с помощью запроса и хочешь что бы информация в DataGrid'е тут же изменилась.
Не вижу ни каких проблем, просто надо не только DataGrid обновлять, но и Recordset, который поставляет ADO Data Control. В общем после того как ты выполнил запрос, изменяющий данные в БД, необходимо сделать следующее: ADODataControl.Recordset.Requery 'обновляешь рекордсет адошного дата контрола, ADODataControl - это допустим название твоего контрола на форме DataGrid.Refresh 'обновляешь сам грид, DataGrid - это название твоего грида на форме . Вот и все. |
|
|
Oleg
|
|
| 09.05.2007, 14:31 | |
|
Да понял ты действительно правильно,
но обновление DateGred и ADOdc на форме никчему не приводят. Подозрение на буфер SQL. На винт не сбрасываются обновления, соответственно обновлять нечего. Опять же повторюсь - обновлять UPDATE в SQL нельзя, т.к. объект считается закрытым. Маленький эксперимент: если после Update, но перед Adodc.Refresh вставить например msgbox, то все работает. Такое впечатление, что буфер не успевает сбросится. |
|
|
Mavr
|
|
| 09.05.2007, 15:21 | |
|
StrSQL = 'UPDATE Documents SET 'Date_Document='' & Date_Document & ' WHERE (CodDocumenta = ' & CodDocument & ')'
Doc.Open StrSQL Эта инструкция сразу записывает изменения (ни какой буфер тут не используется), ты сразу после этой инструкции стопорни код и открой таблицу в БД и увидишь. В твоем коде, который ты привел, просто нет инструкции обновляющей RecordSet для ADO Data Control, т.е. нету вот этого: Adodc.Recorset.Requery и после надо обновить сам грид: DataGrid.Refresh |
|
|
Oleg
|
|
| 10.05.2007, 07:55 | |
|
Делаю следующее
Adodc1.Recordset.Requery Adodc1.Refresh DataGrid1.Refresh и не помогает!!!! |
|
|
vital
|
|
| 10.05.2007, 08:01 | |
|
А лучше всего избавиться от ADODC контрола
и писать напрямую set datagrid.datasource = recordset а обновлять recordset.requery и если не нужно отображение только что добавленых записей recordset.resync с параметром не помню каким быстрее работает |
|
|
Oleg
|
|
| 10.05.2007, 08:07 | |
|
Это конечно очень удобно, но...
Я использую SQL для универсальности, т.е. можно подставлять любую базу: Access, MS SQL, Oracl... Хотя наверно можно и с DateGred также работать Догда возникает такой вопрос: Я не все поля показываю в DateGred, а записывать в него можно все поля или только то, что я вывожу для просмотра? |
|
|
vital
|
|
| 10.05.2007, 08:19 | |
|
На этапе разработки DataGrid можно привязать
к DataEnvironment и отформатировать его как надо а потом убрать DataEnvironment и оставить привязку в коде |
|
|
Mavr
|
|
| 10.05.2007, 08:34 | |
|
Странно после Adodc1.Recordset.Requery, рекордсет должен полностью обновиться, я попробывал все работает. Может у тебя что-то не так с первой частью, ты сразу после Doc.Open StrSQL открывал и смотрел изминения в таблицу БД вносятся или нет, если нет то надо проблему искать там. Могу выслать тебе пример который я попробывал, и у меня все ок, сравнишь со своим и может что найдешь.
Да кстати что-то мне не нравится вот это: Doc.ActiveConnection = dbClient Я делаю: Dim rs As New ADODB.Recordset Set rs.ActiveConnection = Adodc1.Recordset.ActiveConnection |
|
|
Oleg
|
|
| 10.05.2007, 08:41 | |
|
MAVRу - а как ты смотришь?
Если сделать изменения, а потом не торопясь открыть DateGred, то все действительно работает. У меня DateGred уже открыт, далее делаю изменения SQL, а затем все рефреши и реквери. При этом форма с dategred остается открытой. |
|
|
Mavr
|
|
| 10.05.2007, 08:44 | |
|
Действительно попробывал так:
Dim rs As New ADODB.Recordset, dbclient dbclient = Adodc1.Recordset.ActiveConnection rs.ActiveConnection = dbclient и так: Dim rs As New ADODB.Recordset, dbclient Set dbclient = Adodc1.Recordset.ActiveConnection Set rs.ActiveConnection = dbclient Первый вариант странно себя ведет со вторым все ok! Connection это объект и для надежности лучше использовать слово Set. |
|
|
Mavr
|
|
| 10.05.2007, 09:03 | |
|
Послал тебе по почте свой пример.
|
|
|
Oleg
|
|
| 10.05.2007, 09:19 | |
|
Большое спасибо.
Твой пример действительно работает. У меня не так открывалась база. Сейчас все переделаю. А вот как после рефреша остатьна на той же записи? Причем если эта запись 100, а на Gride она 3 строка... |
|
|
Mavr
|
|
| 10.05.2007, 12:28 | |
|
Здесь есть несколько способов.
Можно использовать Bookmark'и как рекордсета так и грида: b = DataGrid1.Bookmark Adodc1.Recordset.Requery DataGrid1.Bookmark = b Однако если были добавлены или удалены записи, то в той строке могут оказаться другие данные или вообще строки уже может не быть. b = Adodc1.Recordset!ID Adodc1.Recordset.Requery Adodc1.Recordset.Bookmark = b Здесь проблема в том что после Requery Bookmark'и не обязаны совпадать, но обычно если не проводилось удаления или добавления записей, то совпадают. В общем с букмарками не совсем надежные способы. Еще один способ использовать в место Requery resync: Adodc1.Resync 'обновляет только уже загруженные записи и указатель текущей не меняется, но не покажет добавленные записи, и если та запись на которой ты стоял в гриде была удалена запросом, то возникает перехватываемая ошибка(включи on error resume next перед resync) Самый надежный это запомнить перед requery первичный ключ записи и после переместиться на эту запись. |
|
|
Oleg
|
|
| 10.05.2007, 12:36 | |
|
Прошу прощения...
Маленько по подробней в последнем способе. Я не слишком силен во всем этом. |
|
| 10.05.2007, 12:36 | |
|
Помогаю со студенческими работами здесь
20
Как сделать базу данных Как создать базу данных? Как перенести базу данных на другой ПК? Как создать трехмерную базу данных Как спроектировать базу данных по анализам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|