Не отрабатывает Recordset в AdoDb при чистке таблицы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vlad_Ginz
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 17.04.2004 (Сб) 0:19

Не отрабатывает Recordset в AdoDb при чистке таблицы

Сообщение Vlad_Ginz » 05.05.2005 (Чт) 0:32

В программе вначале очищаю таблицу в БД :
Dim dbRab As New ADODB.Connection , rst As New ADODB.Recordset, qq$,Cnn$


Cnn = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;" & "Data Source=D:\POPRAB.MDB;"

dbRab.ConnectionString = Cnn
dbRab.CursorLocation = adUseClient ' или adUseServer - пробовал
dbRab.Open

qq = "Delete * From tRabXYZ"
dbRab.Execute (qq)

Все прекрасно очищается (просмотр в Access).Затем создаю Recordset (rst):

qq = "Select * From tRabXYZ"
rst.Open qq, dbRab.ConnectionString, adOpenKeyset, adLockOptimistic, adCmdText
rst.Requery
qq="str"

И далее непонятно. Если между очисткой таблицы и созданием (rst) устанавливаю отладочный (Toggle BreakPoint) -
(например на строке (rst.Open ...)), все прекрасно - на строке (qq="str") Recordset показывает число записей = 0 и rst.absolutePosition = -1, rst.Eof = True
Но как только убираю (Toggle BreakPoint) - Recorset (rst) показывает число записей в таблице
до ее очистки и rst.absolutePosition = 1. , хотя при просмотре в Access таблица чиста !.

Уж пробовал и (rst.requery) после Open и искусственное добавление и удаление записи в (rst) -
результатат - тот же.

после Ваших предложений пробовал :

rst.close и rst.update
и снова открываю Recordset даже с другим именем - rstF.Open ...
Никакого толка. Показывает rst.eof=False , rstBof=False, rst.RecordCount=n, где n-число удаленных записей.

Я просто пытаюсь заменить в старой программе (DAO c DATA) на ADODB и ADODC, чтобы работать с новыми версиями
.mdb Access.
В моей старой программе используется DAO c многочисленными вставками типа (.Execute SQL) и потом созданием новых Recordset и никаких проблем.

Похоже, дело в том, что полностью очищается таблица и возникает какая-то неопределенность, потому что при удалении не всех записей - операторы отрабатывают идеально !
Попробуйте выполнить фрагмент данной программы на своем компьютере. Что получится ? (не забудьте убрать
Toggle BreakPoint, потому что с ним все идет идеально.
Что-то не учитываю. Помогите пожалуйста.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 05.05.2005 (Чт) 9:38

1. Проверь, есть ли в Аксессе транзакции. Если есть, почитай на эту тему - BEGIN / COMMIT тут явно не помешал бы.
2. Проверь, если ли в Аксессе режим неявных транзакций (SET IMPLICIT_TRANSACTIONS {ON | OFF}). Если есть, проверь, как себя в этом вопросе ведет используемый тобой драйвер по дефолту.
3. Ну попробуй, в конце концов, DoEvents / Sleep() поставить перед открытием второй выборки. Это, конечно, некрасиво и ненадежно, но вдруг именно такой подход поможет тебе понять, что же там происходит...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 05.05.2005 (Чт) 10:33

Попробуй так:


Код: Выделить всё
dbRab.ConnectionString = Cnn
dbRab.CursorLocation = adUseClient 
dbRab.IsolationLevel=adXactReadCommitted
dbRab.Open

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.05.2005 (Чт) 13:55

4. Зацени возможность багов и качни с www.microsoft.com/downloads MDAC 2.8 и JET 4.0
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 05.05.2005 (Чт) 15:59

Vlad_Ginz

qq = "Select * From tRabXYZ"
rst.Open qq, dbRab.ConnectionString, adOpenKeyset, adLockOptimistic, adCmdText
rst.Requery
qq="str"

1. Поставь BreakPoint на rst.Open qq, dbRab.ConnectionString, adOpenKeyset, adLockOptimistic, adCmdText
2. Удали rst.Requery
3. Вместо rst.Requery поставь:
If rst.RecordCount >0 then
rst.movelast
rst.movefirst
end if

debug.print rst.RecordCount

4. Напиши что получилось

Vlad_Ginz
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 17.04.2004 (Сб) 0:19

Все без толку. Ну не хочет по человечески ...

Сообщение Vlad_Ginz » 05.05.2005 (Чт) 23:27

Перепробовал все рекомендации. Спокойно съедает и выдает все те же результаты.
Хоть бы кто-нибудь попробовал этот фрагмент на своем компе и отписал хотя бы в честь праздника.
У Вас же может произойти то же самое !
Первому, кто укажет правильный ответ - поставлю свечку.
Жду, жду, жду ...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.05.2005 (Пт) 4:41

Если рекомендацию 4 тоже попробовал, то...
Прямо вот такое ощущение, что ADO прёт выполнять всё асинхронно. Попробуй события рекордсета ловить, типа FetchComplete... И посмотри, точно нигде не юзается adAsyncExecute? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.05.2005 (Пт) 10:17

все работает без проблем и грид ничего не выводит
весь код в студию и саму таблицу и форму с гридом

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.05.2005 (Пт) 11:00

Вот написал для теста, см. и разбирайся:
Вложения
RequeryGrid.zip
(10.81 Кб) Скачиваний: 25

Vlad_Ginz
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 17.04.2004 (Сб) 0:19

Сообщение Vlad_Ginz » 06.05.2005 (Пт) 11:03

"Постояльцу" - просьба более подробно указать Reference и другие
Component, Mdac , версию Access и др., а также привести код, с которым Вы отработали. Возможно, дело в какой - то тонкости, которую я не учитываю.
Благодарю за отклики.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.05.2005 (Пт) 11:05

открой мой проект и все сам увидишь
можно подключаться к любой базе через любой OLEDB провайдер

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.05.2005 (Пт) 11:09

а открывать рекордсет статически не пробовали?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Vlad_Ginz
Новичок
Новичок
 
Сообщения: 41
Зарегистрирован: 17.04.2004 (Сб) 0:19

Сообщение Vlad_Ginz » 06.05.2005 (Пт) 12:31

"Постояльцу" - огромное спасибо за мастер-класс !
Но, сравнивая свои коды с присланными, нашел ошибку в своей программе :
Было : rst.Open "Select ..", dbRab.Connection, ....

Надо было : rst.Open "Select ...", dbRab, ....

Вот и все !
А свечку за здравие поставлю всем откликнувшимся.
Закрываю тему !

val
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 14.11.2002 (Чт) 1:14

Сообщение val » 06.05.2005 (Пт) 15:20

Надеюсь свечка будет не за упокой... :D


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 188

    TopList