|
|
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
привык делать так: var=currentdb.openrecordset("select Name from Names")("Name") вопрос в том - выделяется ли память под такое открытие рекордсета и как его закрыть? а предпосылка вопроса такая: начала вылетать ошибка - Открытие большего числа таблиц невозможно, порылся в инете, нашел что нужно закрывать рекордсеты. Access97 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:41:15 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
recordset.Close ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:45:07 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
currentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных рекордсет я обычно закрываю так: objRst.Close Set objRst = Nothing ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:46:27 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лучше и корректнее Set recorset = nothing ------------------------------------------------------ Заходи в саpай аккуpатно - могут быть сеpьезные гpабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:46:30 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Чем же насинг без клоуза корректнее ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:49:49 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
с этим: objRst.Close Set objRst = Nothing все понятно... но ведь объекту objRst сначала нужно присвоить рекордсет. а я то его открываю без присваивания имени... Или способов кроме присваивания не существует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:51:28 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
AlexJS но ведь объекту objRst сначала нужно присвоить рекордсет. а я то его открываю без присваивания имени... Или способов кроме присваивания не существует? что вы под этим подразумеваете? рекордсет открывается так как у вас и написано в первом посте тольно не objRst = objDb.OpenRecordset(...) а Set objRst = objDb.OpenRecordset(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 15:59:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
да еще сразу не обратил внимание, что это за конструкция у вас такая? ("select Name from Names")("Name") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:02:42 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Lenivecда еще сразу не обратил внимание, что это за конструкция у вас такая? ("select Name from Names")("Name") ну тогда реальный пример: if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then конструкция, поверьте, замечательно работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:08:12 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
DLookup тебе в руки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:14:34 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
AlexJS if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then конструкция, поверьте, замечательно работает без ножа зарезал. что, что работает? Берет первое поле первой записи рекордсета? И что? А Dlookup не проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:17:14 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
автор if currentdb.openrecordset("select IDВыставки from TВыставки where ID=35")("IDВыставки")=185 then конструкция, поверьте, замечательно работает Сишнику такая жуткая конструкция в кошмарном сне не присниться. Где создается объект, где уничтожается ? Зачем из-за одного значения рекордсет гонять ? Эдак и число записей можно в цикле мувнекстом пересчитывать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:18:51 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Спасибо думаю лукап действитльно мне поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:30:16 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Еще не забудьте про остальные DSum, DMax ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:32:32 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Что за бред вы тут понаписали??? Leniveccurrentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных Да ну? Во мля как бывает то Программист-ЛюбительСишнику такая жуткая конструкция в кошмарном сне не присниться. Где создается объект, где уничтожается ? Перепишите этот код на си, и поудивляйтесь немного. Придется точку заменить на "->", а в остальном - те же яйца, только в профиль. Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью. Также все почему-то забывают о такой маааленькой детали... DLookup'у (DSum'у, DMax'у) пофигу на все уровни изоляции транзакций, он в своем воркспейсе работает. Вам оно надо? Точно надо? А вы уверены, что автору вопроса это тоже надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:42:33 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
ЛП: ты топик с начала читал, или только конец? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:47:15 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
автор Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью. Быстрее, чем открытие рекордсета с условием выбора, сортировкой или группировкой и суммрованием плюс выборка поля из него ? Если это проверенная информация, то можно взять на вооружение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:47:56 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Программист-Любитель автор Советующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью. Быстрее, чем открытие рекордсета с условием выбора, сортировкой или группировкой и суммрованием плюс выборка поля из него ? Если это проверенная информация, то можно взять на вооружение. Только что провел тестирование: Код: plaintext 1. 2. 3. 4. 5. 6. в первом случае результат выдается через 6 сек, во втором через 3 сек. На глазок. Что посоветуете в этом случае? Как и рекордсет закрыть, и в скорости не потерять, и сишнику глаза не мозолить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:55:38 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 Kelme ЛП: ты топик с начала читал, или только конец? С начала. Забыл собственно ответ дать 2 AlexJS Если надо быть уверенным в корректном закрытии рекордсета, то надо его куда-нить сохранить. Код: plaintext 1. 2. 2 Программист-Любитель Быстрее, чем открытие рекордсета с условием выбора, сортировкой или группировкой и суммрованием плюс выборка поля из него ? А почему оно должно быть медленнее? Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 16:59:47 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
короче чтобы грамотно закрыть рекордсет, надо его грамотно открыть типа: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:01:21 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
автор Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали? Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще. И рекордсеты внутри они просто обязаны корректно закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:04:16 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
быстрее всего будет Код: plaintext .collect - можно выкинуть как недокументированное, сильно не помогает помогает dbOpenSnapshot против dbOpenDynaset А вот если таблица прилинкованная , замена Currentdb() на переменную, указывающую на базу поможет серьёзно ускориться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:07:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Программист-Любитель автор Можно подумать, что всякие там DLookup'ы не открывают запросы, не накладывают условий, не выполняют всякие там группировки, суммирования и прочее. Если бы это было так, то откуда бы они информацию брали? Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще. И рекордсеты внутри они просто обязаны корректно закрывать. ЛП прав ;) HELP Although you can use the DLookup function to display a value from a field in a foreign table, it may be more efficient to create a query that contains the fields that you need from both tables and then to base your form or report on that query. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:08:07 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
А что есть данные, что при использовании var=currentdb.openrecordset("select Name from Names")("Name") мусор остаётся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:09:24 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Конечно открывают. Но я думал, что в DLookup'ах внутри может быть более соптимизированный алгоритм, нежели в универсальных запросах вообще. А откуда этот соптимизированный алгоритм там возмется? И как можно еще более оптимизировать какое-нибудь условие типа "Поле=Значение"? Есть индекс - будем его использовать, нет индекса - будем сканить. Это в случае запроса. А в случае DLookup'а - хрен его знает как ему в голову взбредет поиск выполнять. И рекордсеты внутри они просто обязаны корректно закрывать. Угу. Обязаны. Конструкция типа CurrentDb.OpenRecordset("трампампам")("трампампам") тоже обязана рекордсеты закрывать. Однако... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:10:41 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey ShА что есть данные, что при использовании var=currentdb.openrecordset("select Name from Names")("Name") мусор остаётся? cм. начало топика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:10:52 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Сервиспаки на офис и Jet стоят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:19:25 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey ShСервиспаки на офис и Jet стоят? Если это по поводу 3сек VS 6сек то стоит пак на офис и mdac 2.8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:23:52 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 AlexJS: нет, я по поводу утечки памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:26:45 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лох Позорный Что за бред вы тут понаписали??? Leniveccurrentdb это вообще очень гнусная вещь, советую ею не пользоваться, так как каждый currentdb приводит к открытию нового экземпляра базы данных Да ну? Во мля как бывает то можно писать настольные базочки и ржать себе тихонечко в уголочке над реальными вещами которые не замечаешь сам, а вот когда поработаешь на том уровне на котором мне приходится, тогда и начнеш замечать разные факты, которые не волнуют в других случаях на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:34:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
автор на нашей программе, которая кстати сказать работает досихпор на 97 аксесе, работают такие крупные предприятия как электростанции РАО ЕС да ужж, атомные станции и ЦУП тож на ваших прогах работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:35:23 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Какова связь между элекстростанцией и CurrentDB ? Может имеется ввиду, что лучше писать Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:40:05 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
очень жалко РАО ЕЭС потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:40:24 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лох Позорныйочень жалко РАО ЕЭС потому что там работают программисты, не понимающие разницы между открытием базы данных и созданием COM-объекта типа DAO.Database гы.. гы.. гы.. очень смешно а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:46:29 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Dbengine(0)(0) не всегда может содержать актуальную для вас версию базы данных, мы в своем проекте данную задачу решили с помощью самовосстанавливающего класса Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:50:39 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
а вы повсей видимости принимали участие в разработке програмных продуктов микрософт и знаете всю реализацию метода CurrentDB ОООооо По всей видимости вы принимали? про класс промолчу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:53:24 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 Lenivec : В в каком воркспэйсе транзакции запускаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 17:59:25 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
По всей видимости вы принимали? я не принимал, но я и не леплю тут ересь про ком объекты про класс промолчу ага, лучше жевать чем говорить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:00:57 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
вы лепите ересь про открытие баз данных и "гнусную вещь CurrentDB" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:02:32 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
вы ещё подеритесь, горячие финские парни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:04:13 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
я тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:05:52 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Shя тут хохмы ради 100000 раз прогнал CurrentDB().Openrecordset и ни килобайта не утекло. CurrentDb() лучше присвоить переменной, ибо CurrentDB() это просто вызов метода Код: plaintext в данном простом случае на высоте оказался сборщик мусора и стойчески подчистил за тобой всю эту гадость а теперь по поводу присвоить переменной, что собственно собой и представляет класс, так трансляторы они обладают одной очень плохой особенностью, терять переменные из-за тех или иных сбоев в работе программы, собственно именно для того чтобы обезопасить себе от потере переменной и был реализован класс, который представляет собой ничто иное как глобальную переменную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:18:56 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
хмм. Кстати немного по теме 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. я делаю такой класс с самоподхватом (инициализируется при первом обращении, или после необрабатываемой ошибки). Вот тогда он и есть самовосстанавливающаяся глобаль (не дергаемая лишний раз). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:27:24 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 Лох Позорный если интересно то посмотрите внимательно что будет происходить с коллекцией DBEngine(0).Databases при создании новых рекордсетов с помощью конструкций типа: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. а во втором случае все рекордсеты будут созданы в одном единственном экземпляре базы данных делайте выводы господа и попробуйте доказать мне что я не прав ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:30:46 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода. 2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:32:14 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 мдя это откуда же вас стоко умных программеров набралось обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:32:59 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
из хелпа к 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") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:34:52 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Sh1) Транслятор не может "потерять" переменную, речь может идти только об интерпретаторе Р-кода. 2) Мне неизвестны случаи пропажи значения переменных в VBA проекте, в концке концов объекты в VBA - это просто ссылки на IUnknown или IDispatch итерфейс. Либо переменной присвоили Nothing в коде, либо при выполнении случилась неперехваченная ошибка и пользователь вырал вариант "End" полность согласен в моем случае это второй вариант, так как проект большой и разрабатываю его не один я, а заставить писать чистый код у меня никаких рычагов нету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:37:11 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
По поводу инициализации класса. Код: plaintext 1. 2. Класс будет инициализироваться при первом вызове метода Если проект сбросится - Run->Reset или End - произойдёт новая инициализация ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:43:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Lenivec2 мдя это откуда же вас стоко умных программеров набралось обоснуйте пожалуйста товарьщь умник почему класс должен инициализироваться при каждом обращении к нему Вы читать умеете, вумник, ля? Напишите то, что предлагалось в ветку #If и спросите пяток раз ?МойКласс.МояБаза.Name 97 запустит Initialize на каждое обращение, муд..рец вы наш. Я просто наблюдал это по факту. Или вы сначала присваиваете обычной глобали Public vМойКласс AS МойКласс ... и где то при загрузке ее инициализируете Set vМойКласс = МойКласс а обращаетесь в коде уже не к классу а к переменной его типа ?vМойКласс.МояБаза.Name ??? только зачем вам тогда класс - это и обычным модулем делается (С теми же проверками ... IS Nothing ) ps (как и думал - Alexey Sh предлагает обращаться не к классу а к некой глобали с типом класса - что несколько разные вещи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 18:49:32 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
класс у меня определяется как Public vМойКласс AS New МойКласс и никаких переинициализаций при этом не возникает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 19:05:55 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Lenivec2 Лох Позорный если интересно то посмотрите внимательно что будет происходить с коллекцией DBEngine(0).Databases при создании новых рекордсетов с помощью конструкций типа: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. а во втором случае все рекордсеты будут созданы в одном единственном экземпляре базы данных делайте выводы господа и попробуйте доказать мне что я не прав И что? Да, вызов CurrentDb создает новый объект типа DAO.Database. Да, этот созданный объект добавляется в коллекцию Databases. А почему бы ему туда не добавляться? Открытие базы данных при этом не происходит. Чтобы вам было понятнее - аналогичный пример с рекордсетами. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Да, новый объект добавляется в семейство Recordsets Открытия рекордсета - нету. Разумеется, объекты типа Recordset, открытые на различных объектах типа Database - держат ссылки на эти самые объекты типа Database. Как только рекордсет закроется - ссылка освободится. Вдогонку про класс ps (как и думал - Alexey Sh предлагает обращаться не к классу а к некой глобали с типом класса - что несколько разные вещи). Что обращение к классу по имени (MoйКласс.МояБаза), что создание глобальной переменной As New - один хрен. Не нужен тут класс вообще. Делается одна глобальная пропертя (с теми же самыми проверками на Nothing) И совсем уж вдогонку Непонятно чем это лучше, чем использование DBEngine(0)(0) Если коллекции (QueryDefs, TableDefs и прочее) меняются - то как ни крути, они и в DBEngine(0)(0) устарели, и в сохраненной переменной в рукотворном классе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 19:17:31 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
автор И что? а то что имеется ограничение на колличество открытых баз данных (кстати что по вашему тогда открытая база данных как не экземпляр объекта?) и это ограничение равно всего навсего 255 и для больших проектов если раскидываться направо и налево CurrentDb, то выделенный лимит исчерпаешь очень быстро автор Что обращение к классу по имени (MoйКласс.МояБаза), что создание глобальной переменной As New - один хрен. Не нужен тут класс вообще. Делается одна глобальная пропертя (с теми же самыми проверками на Nothing) ради бога, хозяин барин, нравится пользуйте, я не запрещаю автор Непонятно чем это лучше, чем использование DBEngine(0)(0) где вы прочитали у меня что чтото лучше или хуже, я лишь указал на недостаток обращения через DBEngine(0)(0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 19:28:13 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 Лох Позорный : хелп про отличия Currentdb() от Dbengine(0)(0) мне сильно не понравился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 19:35:11 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Lenivecкласс у меня определяется как Public vМойКласс AS New МойКласс и никаких переинициализаций при этом не возникает Хм если быт точным, класс у вас определяется как МойКласс. Public vМойКласс AS New МойКласс - это определение переменной а не класса обращение к переменной не есть обращение к классу. Речь шла именно об обращениях к классу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 21:19:51 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 мдя: в VBA классы какие-то болезненные, обращаться к ним иначе как к экзкмплярам никак не получается, ну не нашёл я там статических переменных и методов. Может плохо искал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 21:31:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
а кто вам таки сказал, что в COM бывают статические переменные/методы класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 21:36:45 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Sh2 мдя: в VBA классы какие-то болезненные, обращаться к ним иначе как к экзкмплярам никак не получается, ну не нашёл я там статических переменных и методов. Может плохо искал? Да я не против объявления AS NEW, просто речь шла об обращении именно к классу. При этом (обращении собственно к классу), если класс на держит себя за ссылку (или кто нить еще не держит проинициированную им, не как NEW переменную ), происходит его Initialize, а если держит - не происходит. МетОда с Pablic xxx As New у меня как то выпала из круга решений, то ли по дурости, то ли из за того, что надо где-то в 3-м месте (кроме класса и вызовов) ее (переменную) объявлять. Я просто делел так в самом классе В объявлениях: Private Self As Object В Class_Initialize : ... Set Self = Me В методе Public Sub CloseMe() ... Set Self = Nothing при этом обьявлять дополнительную переменную мне не надо, после первого обращения к любому компоненту/методу класса он держит себя за хвост и повторного Initialize не происходит, пока не произойдет CloseMe, или ошибка - в остальном ведет себя как Ваш экземпляр. Класс я рисовал не для CurrentDB. а для кучки линкованных DB (и Current, заодно), все инициировались напрямую в Initialize (я не закладывался на то, что кто-то снаружи закроет какую-нто ДБ - что, в отсутствии Property Set, кстати сказать и у ленивца нихто не сделает присвоением Nothing, правда метод Close, похоже закроет базу - надо бы и его как-то перекрыть, а не проверять Is Nothing всякий раз), поскольку у меня просто все вызовы написаны как вызовы методов Set rst =МойКласс.МояБ1.OpenRecordset(...) Да, и для транзакций он у меня не заточен, ибо воркспейс в нем у меня задается (пусть и (0)), явно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 22:04:29 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
МойКласс - это что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 22:59:56 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лох ПозорныйСоветующие DLookup (и остальные DSum'ы, DMax'ы) почему-то не упоминают про то, что работает оно медленнее, чем чтение одного поля из рекордсета с одной записью. ... Но сама-то Function CurrentDb() As Database тоже достаточно долгая. Поэтому скорость выполнения будет зависеть от того как ее использовать. Если в цикле гнать считывание поля рекордсета открываемого с CurrentDb, то использование Dlookup будет быстрее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Скорость 2 и 3 примерно одинакова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:32:38 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
уже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза. присвоить глобальной переменной и забыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:37:25 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
И по имени в случае выборки в SELECT одного поля незачем обращаться, индекса 0 достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:38:55 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Lenivec...а то что имеется ограничение на колличество открытых баз данных (кстати что по вашему тогда открытая база данных как не экземпляр объекта?) и это ограничение равно всего навсего 255 и для больших проектов если раскидываться направо и налево CurrentDb, то выделенный лимит исчерпаешь очень быстро Я не понял, вы считаете, что если я несколько раз вызову CurrentDB, то в коллекцию Databases будут добавлены новые объекты? В какой версии Access? For i = 1 To 1000 v = CurrentDb.OpenRecordset("Select * From msysobjects")("id") Next Debug.Print DBEngine(0).Databases.Count Выводится 1 При вызове CurrentDb, если не было присвоения объектной переменной, Database как создается, так и уничтожается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:45:00 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Sh МойКласс - это что? в описанном мною выше - это имя (модуля) класса (т.е. "самого класса"), в котором и описан самоподхват (Set Self = Me) и все прочее. Т.е. "стандартный экземпляр класса", который не умирает пока не вызовете соответствующий метод, или не сбросите программу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:45:23 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey ShИ по имени в случае выборки в SELECT одного поля незачем обращаться, индекса 0 достаточно Какое это имеет отношение к тому, что я написал о сравнении скорости dlookup и CurrentDb.OpenRecordset? Ну замените в моем примере на 0, скорость будет практически таже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:49:19 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 Serge Gavrilov Но сама-то Function CurrentDb() As Database тоже достаточно долгая. Используйте DBEngine(0)(0), оно быстрое :) Я не понял, вы считаете, что если я несколько раз вызову CurrentDB, то в коллекцию Databases будут добавлены новые объекты? В какой версии Access? В любой версии аксес - если сохранять ссылку на открытый рекордсет . Так что речь идет не о том, что "вызовами CurrentDb раскидываться направо и налево", а о том, что "открытыми рекордсетами раскидываться направо и налево". Надобность держать 255 открытых курсоров - весьма сомнительна, тем не менее сгодится как аргумент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:50:12 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза. присвоить глобальной переменной и забыть. Интересное решение :-) Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:53:21 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза. присвоить глобальной переменной и забыть. Интересное решение :-) Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит. Появление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:56:30 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза. присвоить глобальной переменной и забыть. Интересное решение :-) Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит. Ну, Refresh семейств никто не отменял. Надо только делать их выборочно и выигрыш в скорости супротив повсеместного CurrentDB будет на лице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:57:27 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Serge Gavrilov Alexey Shуже писал здесь, нефиг вызывать Application.CurrentDb() больше одного раза. присвоить глобальной переменной и забыть. Интересное решение :-) Но ведь Database может меняться: может добавиться таблица, а ваша глобальная переменная это не заметит. не заметит этого и DBEngine(0)(0), и точно так же не заметит этого предлагаемый ленивцем чудо-класс Метод Refresh у коллекций есть на этот случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2004, 23:59:37 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Более того, я и с "темповой" LocaDB так работаю. Пока жив. (где уш тут ашипка праэктирования, когда сама LocaDB может появиться в процессе работы, не говоря о "темповых" таблицах). И при удаленном пополнении базы с данными новыми таблицами (с учетом того, что процедура эта разовая - при модификации структуры) - мне достаточно не забыть сделать Refresh семейств и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:02:10 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лох ПозорныйИспользуйте DBEngine(0)(0), оно быстрое :) да Лох Позорный В любой версии аксес - если сохранять ссылку на открытый рекордсет . Так что речь идет не о том, что "вызовами CurrentDb раскидываться направо и налево", а о том, что "открытыми рекордсетами раскидываться направо и налево". Надобность держать 255 открытых курсоров - весьма сомнительна, тем не менее сгодится как аргумент. согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:02:21 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Вообще то говоря появление новой таблицы никак не мешает обратиться к ней с помощью сохранённой до её создания ссылки на CurrentDB() Где у Карла Маркса написано, что MSYSOBJECT загружается в память намертво? Попробуйте, без всякого Refresh рекордсеты будут успешно открываться. Если уж что и грузится в память, то это коллекции Application.Containers ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:04:25 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования Ну, кто-то может сказать, что и использование Access - это ошибка проектирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:05:30 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 мдя: странно, с временной db я уже лет 6 как работаю таким образом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:06:20 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Serge Gavrilov Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования Ну, кто-то может сказать, что и использование Access - это ошибка проектирования. я трактую ссылку на CurrentDB() как некий аналог коннекшна, которые собраны далее в workspace, который обеспечивает единое пространство транзакций для нескольких коннектов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:08:37 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey Sh2 мдя: странно, с временной db я уже лет 6 как работаю таким образом :) рад за вас, а то я аж вспотел с перепугу читая: Alexey ShПоявление "на лету" новых таблиц, модификация их структуры - это ошибка проектирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:08:59 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
2 мдя: я сознательно временные базы и таблицы оставил за рамками обсуждения, чтоб не усложнять задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:11:09 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Лох Позорный...не заметит этого и DBEngine(0)(0), и точно так же не заметит этого предлагаемый ленивцем чудо-класс Метод Refresh у коллекций есть на этот случай. сам по себе вызов DBEngine(0)(0) заметит... А скорость Refresh не будет сопоставим с самим присвоением Set db=CurrentDb? Я не проверял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:12:23 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Отцы, вы лучше расшифруйте загадку из хелпа к 2003 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:14:46 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Alexey ShОтцы, вы лучше расшифруйте загадку из хелпа к 2003 Это примечание существует еще с Access 97, в чем именно загадка? : Help Примечание. В предыдущих версиях Microsoft Access для возвращения указателя текущей базы данных использовался синтаксис DBEngine.Workspaces(0).Databases(0) или DBEngine(0)(0). В Microsoft Access для Windows 95 вместо этого следует использовать функцию CurrentDb. Функция CurrentDb создает новый экземпляр текущей базы данных, тогда как конструкция DBEngine(0)(0) представляет ссылку на открытую копию текущей базы данных. С помощью функции CurrentDb пользователь имеет возможность создать несколько объектных переменных типа Database, представляющих текущую базу данных. Microsoft Access по-прежнему поддерживает синтаксис DBEngine(0)(0), однако, рекомендуется внести изменения в имеющиеся программы во избежание возможных конфликтов при работе с сетевой базой данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:21:24 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
1) О каких конфликтах идёт речь? 2) Зачем плодить коннекты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:39:43 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 00:54:44 |
|
||
|
как грамотно закрыть recordset?
|
|||
|---|---|---|---|
|
#18+
Усё. резюмирую - вызывать CurrentDB() один раз, дабы сэкономить место в Dbengine(0) да и процессор незачем напрягать. Workspace - не резиновый, 253 максимум члена в коллекции Проверил, лишние CurrentDB() лишних коннектов к базе не создают, и то хорошо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2004, 01:09:49 |
|
||
|
|

start [/forum/topic.php?all=1&fid=45&tid=1669899]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
23ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
104ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 351ms |

| 0 / 0 |
