powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как грамотно закрыть recordset?
25 сообщений из 84, страница 2 из 4
как грамотно закрыть recordset?
    #32817168
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey ShА что есть данные, что при использовании var=currentdb.openrecordset("select Name from Names")("Name")
мусор остаётся?

cм. начало топика
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817190
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервиспаки на офис и Jet стоят?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817206
AlexJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey ShСервиспаки на офис и Jet стоят?

Если это по поводу 3сек VS 6сек то стоит пак на офис и mdac 2.8
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817215
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AlexJS:

нет, я по поводу утечки памяти.
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817239
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный
Что за бред вы тут понаписали???

Leniveccurrentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных
Да ну? Во мля как бывает то



можно писать настольные базочки и ржать себе тихонечко в уголочке над реальными вещами которые не замечаешь сам, а вот когда поработаешь на том уровне на котором мне приходится, тогда и начнеш замечать разные факты, которые не волнуют в других случаях

на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817243
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС


да ужж, атомные станции и ЦУП тож на ваших прогах работает?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817253
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какова связь между элекстростанцией и CurrentDB ?

Может имеется ввиду, что лучше писать
Код: plaintext
1.
2.
3.
4.
5.
Dim pdb as Database
set pdb =Dbengine( 0 )( 0 )
....
pdb.Openrecordset

...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817254
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень жалко РАО ЕЭС
потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817271
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорныйочень жалко РАО ЕЭС
потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database

гы.. гы.. гы..
очень смешно
а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817283
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dbengine(0)(0) не всегда может содержать актуальную для вас версию базы данных, мы в своем проекте данную задачу решили с помощью самовосстанавливающего класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private IsCurDb As DataBase

Private Sub Class_Initialize()
    Set IsCurDb = Nothing
End Sub

Public Property Get curDB() As DataBase
    If IsCurDb Is Nothing Then
        Set IsCurDb = CurrentDb()
    End If
    Set curDB = IsCurDb
End Property

Private Sub Class_Terminate()
    If Not IsCurDb Is Nothing Then
        IsCurDb.Close
        Set IsCurDb = Nothing
    End If
End Sub
и все обращение к базе идет через данный класс
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817290
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB
ОООооо
По всей видимости вы принимали?


про класс промолчу
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817310
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lenivec :

В в каком воркспэйсе транзакции запускаются?
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817316
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По всей видимости вы принимали?

я не принимал, но я и не леплю тут ересь про ком объекты


про класс промолчу

ага, лучше жевать чем говорить
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817320
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы лепите ересь про открытие баз данных и "гнусную вещь CurrentDB"
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817323
Kelme
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы ещё подеритесь, горячие финские парни
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817327
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода
Код: plaintext
Application.CurrentDb()
и никакой мистики
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817348
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Shя тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода
Код: plaintext
Application.CurrentDb()
и никакой мистики

в данном простом случае на высоте оказался сборщик мусора и стойчески подчистил за тобой всю эту гадость

а теперь по поводу присвоить переменной, что собственно собой и представляет класс, так трансляторы они обладают одной очень плохой особенностью, терять переменные из-за тех или иных сбоев в работе программы, собственно именно для того чтобы обезопасить себе от потере переменной и был реализован класс, который представляет собой ничто иное как глобальную переменную
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817358
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм. Кстати немного по теме

1. смотрел я как то код Майкрософта в 97, так там любой If писался так
If (MyBoolVar) Then

2. Известная фича 97 - отсутствие некоего вычисления выражения в IF в 97 может приводить к незакрытию Access
If Me.chk Then - Access виснет
If Me.chk = True Then - Access не виснет

3. () - тоже выражение.

=> если проверяте буленовы поля
If CurDb.OpenRecordset("xxxx")("MyBool") Then - трудно сказать что тут может быть (по аналогии с глюком на If Me.chk Then)



Мдя, с классом явно не возились. Он же инициируется при каждом к нему обращении. (можете написать внем
Код: plaintext
1.
2.
3.
4.
5.
Private Sub Class_Initialize()
On Error GoTo err
    #If (DebugVersion) Then
        Debug.Print "Class_Initialize"
    #End If
...
и тайное станет явным
я делаю такой класс с самоподхватом (инициализируется при первом обращении, или после необрабатываемой ошибки). Вот тогда он и есть самовосстанавливающаяся глобаль (не дергаемая лишний раз).
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817362
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лох Позорный
если интересно то посмотрите внимательно что будет происходить с коллекцией DBEngine(0).Databases при создании новых рекордсетов с помощью конструкций типа:
Код: plaintext
1.
2.
3.
4.
5.
set objRst1 = CurrentDb.OpenRecordset(...)
set objRst2 = CurrentDb.OpenRecordset(...)
set objRst3 = CurrentDb.OpenRecordset(...)
set objRst4 = CurrentDb.OpenRecordset(...)
set objRst5 = CurrentDb.OpenRecordset(...)
или типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
set objDb = CurrentDb
set objRst1 = objDb.OpenRecordset(...)
set objRst2 = objDb.OpenRecordset(...)
set objRst3 = objDb.OpenRecordset(...)
set objRst4 = objDb.OpenRecordset(...)
set objRst5 = objDb.OpenRecordset(...)
так вот, в первом случае на каждый отдельный рекордсет в коллекцию будет добавлен отдельный экземпляр базы данных
а во втором случае все рекордсеты будут созданы в одном единственном экземпляре базы данных

делайте выводы господа
и попробуйте доказать мне что я не прав
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817364
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода.

2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End"
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817367
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 мдя
это откуда же вас стоко умных программеров набралось
обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817374
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из хелпа к 2003 аксессу

CurrentDb Method
See AlsoApplies ToExampleSpecifics
The CurrentDb method returns an object variable of type Database <mk:@MSITStore:dao360.chm::/html/daobjDatabase.htm> that represents the database currently open in the Microsoft Access window.
expression.CurrentDb
expression Required. An expression that returns one of the objects in the Applies To list.
Remarks
Note In Microsoft Access the CurrentDb method establishes a hidden reference to the Microsoft DAO 3.6 Object Library in a Microsoft Access database (.mdb).
In order to manipulate the structure of your database and its data from Visual Basic, you must use Data Access Objects (DAO). The CurrentDb method provides a way to access the current database from Visual Basic code without having to know the name of the database. Once you have a variable that points to the current database, you can also access and manipulate other objects and collections in the DAO hierarchy <mk:@MSITStore:dao360.chm::/html/daconMSJetDatabaseEngine25.htm>.
You can use the CurrentDb method to create multiple object variables that refer to the current database. In the following example, the variables dbsA and dbsB both refer to the current database:
Dim dbsA As Database, dbsB As Database
Set dbsA = CurrentDb
Set dbsB = CurrentDb

Note In previous versions of Microsoft Access, you may have used the syntax DBEngine.Workspaces(0).Databases(0) or DBEngine(0)(0) to return a pointer to the current database. In Microsoft Access 2000, you should use the CurrentDb method instead. The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database. The CurrentDb method enables you to create more than one variable of type Database that refers to the current database. Microsoft Access still supports the DBEngine(0)(0) syntax, but you should consider making this modification to your code in order to avoid possible conflicts in a multiuser database (multiuser (shared) database: A database that permits more than one user to access and modify the same set of data at the same time.).
If you need to work with another database at the same time that the current database is open in the Microsoft Access window, use the OpenDatabase <mk:@MSITStore:dao360.chm::/html/damthOpenDatabase.htm> method of a Workspace <mk:@MSITStore:dao360.chm::/html/daobjWorkspace.htm> object. The OpenDatabase method doesn't actually open the second database in the Microsoft Access window; it simply returns a Database variable representing the second database. The following example returns a pointer to the current database and to a database called Contacts.mdb:
Dim dbsCurrent As Database, dbsContacts As Database
Set dbsCurrent = CurrentDb
Set dbsContacts = DBEngine.Workspaces(0).OpenDatabase("Contacts.mdb")
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817375
Lenivec
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода.

2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End"

полность согласен
в моем случае это второй вариант, так как проект большой и разрабатываю его не один я, а заставить писать чистый код у меня никаких рычагов нету
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817384
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу инициализации класса.

Код: plaintext
1.
2.
Option Compare Database
Option Explicit
Dim tс As New MyClass

Класс будет инициализироваться при первом вызове метода
Если проект сбросится - Run->Reset или End - произойдёт новая инициализация
...
Рейтинг: 0 / 0
как грамотно закрыть recordset?
    #32817389
мдя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenivec2 мдя
это откуда же вас стоко умных программеров набралось
обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему
Вы читать умеете, вумник, ля?
Напишите то, что предлагалось в ветку #If и спросите пяток раз
?МойКласс.МояБаза.Name
97 запустит Initialize на каждое обращение, муд..рец вы наш. Я просто наблюдал это по факту.

Или вы сначала присваиваете обычной глобали
Public vМойКласс AS МойКласс
...
и где то при загрузке ее инициализируете
Set vМойКласс = МойКласс
а обращаетесь в коде уже не к классу а к переменной его типа
?vМойКласс.МояБаза.Name

???
только зачем вам тогда класс - это и обычным модулем делается (С теми же проверками ... IS Nothing )

ps (как и думал - Alexey Sh предлагает обращаться не к классу а к некой глобали с типом класса - что несколько разные вещи).
...
Рейтинг: 0 / 0
25 сообщений из 84, страница 2 из 4
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / как грамотно закрыть recordset?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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