Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/23: Рейтинг темы: голосов - 23, средняя оценка - 4.96
Oleg

Как обновить базу данных?

12.04.2007, 07:50. Показов 4752. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую DataGrid (OLEDB) и ADOBD
С помощью запроса изменяю днные в Access-совской таблице, а в DataGrid изменения не видны. Requery и Refresh не помогают.
Подозрение на буферизацию данных.
Так вот как сказать, что надо сбросить буфер на винт, и показать в DataGrid?
Заранее благодарен.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.04.2007, 07:50
Ответы с готовыми решениями:

Как перенаправить в другую базу данных при вызове конкретной строки из таблицы другой базы данных?
Здравствуйте добрые люди! У меня вопрос о базе данных. Есть несколкько баз данных,в каждом из них есть по несколько таблиц. И есть...

Как создавать базу данных?
Имеется нехилый объем данных, который так и просится в СУБД. Из всех прог выбрал Adabas (прошу без аргументаций не переубеждать). Лазил...

Как создать Базу Данных?
как?

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
Прошу прощения...
Маленько по подробней в последнем способе.
Я не слишком силен во всем этом.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru