powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не работает открытие рекордсета – АДО на ВБ6.
11 сообщений из 11, страница 1 из 1
Не работает открытие рекордсета – АДО на ВБ6.
    #35627209
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В процедуре загрузки формы, открываю соединение с базой:
' dteRcp- DataEnvironment
' cnnRep- Connection
' GrdTot- Command
rsGrdTot- Recordset
With dteRcp
If .cnnRep.State Then .cnnRep.Close 'в ConnectionString, объекта
.cnnRep.ConnectionString = .cnnLDO.ConnectionString
.cnnRep.Open

If .rsGrdTot.State Then .rsGrdTot.Close
.rsGrdTot.Source = .rsGrdTot.Source
.rsGrdTot.Source = "SHAPE ( SHAPE {SELECT PltPrc, NmPrc, CstPrc, Amt, `Summ` " _
& "FROM qrProcPlz } AS Svod COMPUTE Svod, SUM(Svod.'Summ') " _
& "AS Aggregate1 BY 'PltPrc') AS Svod_Grouping COMPUTE " _
& "SUM(Svod_Grouping.'Aggregate1') AS TotSum, Svod_Grouping"
.rsGrdTot.Open
End With
При первом открытии, смотрю в отладчике все нормально
cnnRep.State=1
rsGrdTot.State=1
Отчет базирующийся на GrdTot работает нормально. После закрытия формы и открытия ее вновь:
cnnRep.State=1,
а на строке .rsGrdTot.Open вылетает ошибка - Run-Time error ‘3709’ «Не возможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте.»
Что можно сделать, что бы обойти это?
Заранее благодарен.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35644964
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что, ни кто не работал с Command-ами с группировкой? Так а как же тогда получить самый простейший отчет в VB с итогами? Или это не тот форум? Но написано вроде Visual Basic :(
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35644998
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afalОтчет базирующийся на GrdTot работает нормально. После закрытия формы и открытия ее вновь:
cnnRep.State=1,
а на строке .rsGrdTot.Open вылетает ошибка - Run-Time error ‘3709’ «Не возможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте.»
Что можно сделать, что бы обойти это?Открытие и закрытие формы само по себе никак не влияет на открытие и закрытие ADO объектов. Забудь про форму, думай как правильно завершать коннект с базой.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35645519
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я это понимаю, но получается что как-то косвенно влияет, поскольку факт на лице. Вот если я закрываю программу полностью, т.е. заново конъекчусь к базе и создаются заново все объекты АДО, все замечательно. А при закрытии только формы и открытии ее вновь, рекордсет не открывается. Хотя при открытой форме первый раз при любом количестве отрытий отчета, ошибки нет. Нужно имитировать при закрытии формы закрытие соединения и открывать его заново при открытии, но не могу найти методы реализующие это. Вот и думал, что у кого-то уже подобные проблемы были и есть примерный алгоритм решения
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35647478
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afalНужно имитировать при закрытии формы закрытие соединения и открывать его заново при открытии, но не могу найти методы реализующие это. Вот и думал, что у кого-то уже подобные проблемы были и есть примерный алгоритм решенияНе нужно имитировать закрытие соединения, его нужно просто закрывать.
У тебя в событии закрытия формы есть код типа
Код: plaintext
1.
rs.Close
conn.Close
Если нету - поставь. Если есть, проверяй что оно закрывает именно те рекордсеты и коннекты что нужно.
Смотри где и когда ты эти коннекты и рекордсеты создаешь. Если каждый раз при открытии формы - не забывай убивать их при закрытии формы (присвой им nothing ).

А вообще, открывание нового коннекта при каждом открытии формы это в 99.9% глупость. Лишняя нагрузка на сервер БД. Все можно и нужно делать через один коннект. Один юзер - один коннект.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35649776
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
«У тебя в событии закрытия формы есть код типа
rs.Close
conn.Close»

Этот код у меня есть в первом топике. И реализуется конкретно он следующими строками:
With dteRcp
If .cnnRep.State Then .cnnRep.Close '
.cnnRep.ConnectionString = .cnnLDO.ConnectionString
.cnnRep.Open

If .rsGrdTot.State Then .rsGrdTot.Close

здесь .cnnRep это conn, а .rsGrdTot – rs.
Попробовал сделать тоже самое в процедуре выгрузки формы вот так:

Private Sub Form_Unload(Cancel As Integer)
With dteRcp
If .rsGrdTot.State Then .rsGrdTot.Close
If .rsGrandTotal1.State Then .rsGrandTotal1.Close
If .rsGrdTot2.State Then .rsGrdTot2.Close
If .cnnRep.State Then .cnnRep.Close
End With
' dteRcp.cnnRep = Nothing
End Sub

Результат не изменился, та же ошибка. Значит задержка по времени ни причем. А вот на строку dteRcp.cnnRep = Nothing ругается компилятор – пишет не правильное использование объекта. Почему у меня не идет это? Где-то в примерах я встречал такую запись, а у меня ошибка.

«А вообще, открывание нового коннекта при каждом открытии формы это в 99.9% глупость. Лишняя нагрузка на сервер БД. Все можно и нужно делать через один коннект. Один юзер - один коннект.»

Совершенно согласен! Но это не от хорошей жизни, а от недоработок Майкрософта. На одном коннекте вообще не работает. Один коннект я использую для ввода и просмотра данных, второй – для отчетов. Так работает. Дело в том, что в отчетах нужна группировка и итоговые значения, а такие Command-ы, если их посадить на один коннект, запирают все. Вот и приходится изощряться, что бы хоть что-то получилось. А база без отчетов, вообще не имеет смысла. Наверное следующий раз придется заполнять шаблоны в Excel, но по трудоемкости это вообще мрак.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35650206
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забывай пользоваться кнопками SRC и QUOTE. Прочитай вот этот топик: http://www.sql.ru/faq/faq_topic.aspx?fid=202

afalПопробовал сделать тоже самое в процедуре выгрузки формы вот так:

Private Sub Form_Unload(Cancel As Integer)
With dteRcp
If .rsGrdTot.State Then .rsGrdTot.Close
If .rsGrandTotal1.State Then .rsGrandTotal1.Close
If .rsGrdTot2.State Then .rsGrdTot2.Close
If .cnnRep.State Then .cnnRep.Close
End With
' dteRcp.cnnRep = Nothing
End Sub

Результат не изменился, та же ошибка. Значит задержка по времени ни причем.
При чем здесь "задержка по времени"? Прогони закрытие формы в дебаггере, убедись что оно действительно закрывает коннект. Подключись как администратор к своей базе данных и посмотри количество коннектов до открытия формы со вторым коннектом и после закрытия формы.

afalА вот на строку dteRcp.cnnRep = Nothing ругается компилятор – пишет не правильное использование объекта.
Любая работа с объектами идет через специальное слово SET.

afal«А вообще, открывание нового коннекта при каждом открытии формы это в 99.9% глупость. Лишняя нагрузка на сервер БД. Все можно и нужно делать через один коннект. Один юзер - один коннект.»

Совершенно согласен! Но это не от хорошей жизни, а от недоработок Майкрософта. На одном коннекте вообще не работает.Неправда. Любую работу с базой данных можно вести на одном коннекте и одном резалтсете. У тебя их там как минимум три штуки, это плохо. В один момент времени по коннекту могут идти данные только для одного резалтсета. Не важно сколько резалтсетов и стейтментов ты подготовил, но если ты не выкачал первый резалтсет до конца - любая попытка работы со вторым резалтсетом выльется в ошибку типа "сейчас нельзя".

afalОдин коннект я использую для ввода и просмотра данных, второй – для отчетов.Если привязываешь свои визуальные таблички и формы редактирования данных напрямую к резалтсет-объектам, то в этом и есть главная проблема. Гриды и отчетники по умолчанию выкачивают только столько строк, сколько нужно для показа первой странички. Что естественно блокирует все остальные резалтсеты висящие на этом же коннекте.
Выкачивай данные самостоятельно в свои собственные массивы и показывай пользователю только то что находится в твоих массивах.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35652196
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
Прогони закрытие формы в дебаггере, убедись что оно действительно закрывает коннект.
Прогонял, убаждался, что все идет как задумано до вываливания в ошибку. Поэтому и природа ошибки не понятна. Хотя как я уже писал не могу присвоить Nothing, возможно это и решило бы проблему.
Код: plaintext
Подключись как администратор к своей базе данных и посмотри количество коннектов до открытия формы со вторым коннектом и после закрытия формы. 
База у меня спроектирована в Access и как там проверить количество коннектов, я что-то не представляю. Но в отладчике ошибка происходит именно при открытии предварительно закрытого объекта т.е. State объектов меняется нормально и потом при State=0, вдруг пишет, что открыть сейчас нельзя. Хотя первый раз при тех же условиях все открывает.
Код: plaintext
Любая работа с объектами идет через специальное слово SET.
Да пробовал я и с применением SET, просто тут у меня закомментировано в последнем варианте, в надежде, что может так заработает. Но не хочет ни так ни с SET :(
Код: plaintext
Неправда. Любую работу с базой данных можно вести на одном коннекте и одном резалтсете. У тебя их там как минимум три штуки, это плохо.
Да можно то можно, но не нужно. При большом объеме кода и Sours-ов, в форме будет путаница, поскольку у разных по содержанию объектов будет одно имя. И будет гораздо сложнее выяснить какое «содержание» в данный момент времени работает.
А страшного в их большом количестве ни чего нет, поскольку нельзя щелкнуть мышкой одновременно по двум объектам, а соответственно и вызвать два события и поэтому условие В один момент времени по коннекту могут идти данные только для одного резалтсета. будет выполняться.

Код: plaintext
Выкачивай данные самостоятельно в свои собственные массивы и показывай пользователю только то что находится в твоих массивах
Вообще не слышал об этом :( Случайно ссылки нет, где можно почитать? Но ведь получится избыточность данных из базы нужно перегонять в массивы, будет и тем и тут. А как потом эти массивы подключать к Sours-ам объектов? Или опять кодом переписывать в элементы управления. Если так, то это очень трудоемкий путь и громадная не доработка Майкрософта!!! С базой нужно работать получая из нее уже готовые данные для обработки информации, а не переписывать данные в еще одну базу. Хотя, может я, что-то не так понял.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35652220
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо "массивы" читай отсоединенные рекордсеты
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35652825
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо путать кнопки src и quote. Пользуйся кнопкой "предварительный просмотр"

afalА страшного в их большом количестве ни чего нет, поскольку нельзя щелкнуть мышкой одновременно по двум объектам, а соответственно и вызвать два события и поэтому условие В один момент времени по коннекту могут идти данные только для одного резалтсета. будет выполняться. Еще раз повторяю: стандартные db-таблицы и db-формы не делают полной выборки. Они выкачивают только столько строк, сколько нужно для немедленного показа пользователю.
Это означает что ты в принципе можешь держать на экране только одну таблицу или одну форму.


afalВообще не слышал об этом :( Случайно ссылки нет, где можно почитать? Но ведь получится избыточность данных из базы нужно перегонять в массивы, будет и тем и тут. А как потом эти массивы подключать к Sours-ам объектов? Или опять кодом переписывать в элементы управленияЭто не так уж трудоемко и намного надежнее и удобнее.
...
Рейтинг: 0 / 0
Не работает открытие рекордсета – АДО на ВБ6.
    #35656504
afal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One вместо "массивы" читай отсоединенные рекордсеты
Ну это более понятно, только тоже упирается в Nothing.
В чем моя ошибка, почему при присвоении Nothing соединению или рекордсету происходит ошибка?

White Owl Еще раз повторяю: стандартные db-таблицы и db-формы не делают полной выборки. Они выкачивают только столько строк, сколько нужно для немедленного показа пользователю.
Это означает что ты в принципе можешь держать на экране только одну таблицу или одну форму.
Да в данном случае это не важно. Ведь работает же все как надо и сколько надо, пока не закроется и не откроется заново форма. Меняются диапазоны дат выборки и прочие условия и все выберается правильно. Ошибка только при закрытии и новом открытии формы. При закрытии и новом запуске всего приложения все опять нормализуется до закрытия этой злосчастной формы.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не работает открытие рекордсета – АДО на ВБ6.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]