Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как можно пробежаться по коннекшенам и рекордсетам

266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Народ, обычно при закрытии программы я использую конструкцию типа:
Код:
Dim Frm As Form
 For Each Frm In Forms
    If Frm.Name <> Me.Name And Not (Frm Is Nothing) Then
      Unload Frm
    End If
  Next

  If Not (GlADOConn Is Nothing) Then
    If GlADOConn.State <> adStateClosed Then
      GlADOConn.Close
    End If
    Set GlADOConn = Nothing
  End If


Тут, как видите, во втором цикле уничтожается коннект. Возникла такая проблема: "на лету" необходимо "обрубить" все коннекшены и рекордсеты, а затем восстановить их с новыми параметрами.
Для этого я хочу в цикле, аналогичном тому, в котором я выгружаю формы, "обрубать" коннекшены и рекордсеты. Типа
 
Код:
Dim Rs AS Object
 For Each Rs In ADODB.Recordset
      Rs.Close
      Set Rs = Nothing
 Next

 For Each Rs In ADODB.Connection
      Rs.Close
      Set Rs = Nothing
 Next

как такое реализовать? Можно ли?
Если быть более корректным, то какой объект является в данном случае родительским для коннекшенов и рекордсетов. Если для рекордсетов можно предположить родительским коннект, то что в данном случае радительское для коннекта? Где просматривать перечень коннектов. In Project, сами понимаете, не прокатывает, так как нет такого объекта.
319
21 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov
Народ, обычно при закрытии программы я использую конструкцию типа:
Код:
Dim Frm As Form
 For Each Frm In Forms
    If Frm.Name <> Me.Name And Not (Frm Is Nothing) Then
      Unload Frm
    End If
  Next

  If Not (GlADOConn Is Nothing) Then
    If GlADOConn.State <> adStateClosed Then
      GlADOConn.Close
    End If
    Set GlADOConn = Nothing
  End If


Тут, как видите, во втором цикле уничтожается коннект. Возникла такая проблема: "на лету" необходимо "обрубить" все коннекшены и рекордсеты, а затем восстановить их с новыми параметрами.
Для этого я хочу в цикле, аналогичном тому, в котором я выгружаю формы, "обрубать" коннекшены и рекордсеты. Типа
 
Код:
Dim Rs AS Object
 For Each Rs In ADODB.Recordset
      Rs.Close
      Set Rs = Nothing
 Next

 For Each Rs In ADODB.Connection
      Rs.Close
      Set Rs = Nothing
 Next

как такое реализовать? Можно ли?
Если быть более корректным, то какой объект является в данном случае родительским для коннекшенов и рекордсетов. Если для рекордсетов можно предположить родительским коннект, то что в данном случае радительское для коннекта? Где просматривать перечень коннектов. In Project, сами понимаете, не прокатывает, так как нет такого объекта.


Имхо, в коллекциях этих объектов - коллекции этих объектов существуют, проблем нет :) а вот как получить все созданные коннекшены и рекордсеты - не сталкивался :)
Странная проблема, ты не знаешь какие коннекшены у тебя есть? :) откуда они берутся, если не ты их создаешь? или ты пишешь серверную часть для какой-то локальной БД? имхо, готовое решение проще взять :)

266
22 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by xelos

Имхо, в коллекциях этих объектов - коллекции этих объектов существуют, проблем нет :) а вот как получить все созданные коннекшены и рекордсеты - не сталкивался :)
Странная проблема, ты не знаешь какие коннекшены у тебя есть? :) откуда они берутся, если не ты их создаешь? или ты пишешь серверную часть для какой-то локальной БД? имхо, готовое решение проще взять :)


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

319
22 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by mhaturov

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


я коннекшены локально всегда объявляю, глобальные (на весь класс) у меня только дата адаптеры, датасеты и иногда таблицы. Я в ADO пишу. так что таких проблем нет, все коннекшены автоматом закрываются при выходе из функций, где они вызываются.

266
22 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by xelos

я коннекшены локально всегда объявляю, глобальные (на весь класс) у меня только дата адаптеры, датасеты и иногда таблицы. Я в ADO пишу. так что таких проблем нет, все коннекшены автоматом закрываются при выходе из функций, где они вызываются.


Ну это немного ненадёжно (Microsoft советует "ручкаи" коннекшены обрубать, насколько я заню). Кроме того, мне удобнее иметь 1 глобальный коннекшн. на котором висит 90% операций, ну и несколько локальных вспомогательных. Однако, хочется создать универсальную процедуру выгрузки всех открытых коннекшенов. Во-первых, для универсальности, а во-вторых, просто нужно очень, так как надо "на лету" переконнекчиваться, а формы я не выгружаю до конца работы программы, а в некоторых из них на уровне форм объявлены коннекты.
Сейчас я "запнулся" вот на чём:

Код:
Dim RsConn As ADODB.Recordset
  Dim RConn As ADODB.Connection

        For Each RConn In А вот в чём - не знаю...
          If Not RConn Is Nothing Then
            If RConn.State <> adStateClosed Then
              For Each RsConn In RConn
                If Not RsConn Is Nothing Then
                  If RsConn.State <> adStateClosed Then
                    RsConn.Close
                  End If
                  Set RsConn = Nothing
                End If
              Next
              RsConn.Close
            End If
            Set RsConn = Nothing
          End If
        Next
478
22 января 2004 года
XtreamAll
279 / / 01.10.2003
Посмотри библиотеки like "Microsoft Data Environment*"...
тама есть и Connection и Connections...
266
22 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
Посмотри библиотеки like "Microsoft Data Environment*"...
тама есть и Connection и Connections...


Не принимает в качестве родителя...:{ Пришлось пока реализовать по-старинке...:{

258
22 января 2004 года
SergeySV
1.5K / / 19.03.2003
mhaturov: понимаешь, объект Connection находится на самом верхнем уровне иерархии объектов ADO, для доступа к любым объектам из иерархии ADO требуется явно или неявно создать и Connection.
Так что в ADО у Connection нет родительской коллекции и через ADO ты никак их не переберешь.

Тут можно надется токо CurrentProject и иже с ним (это соотв. токо для Access), может через них есть вариант, надо смотреть, но тебя помойму такой вариант не устаривает.
478
22 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by mhaturov

Не принимает в качестве родителя...:{ Пришлось пока реализовать по-старинке...:{



А почему не создать свою колекцию и туда добавлять все созданные Коннекшены...
... то же для Рекордсетов...

266
22 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll


А почему не создать свою колекцию и туда добавлять все созданные Коннекшены...
... то же для Рекордсетов...


Чтож, жаль... Я подозревал, что у коннекшена и рекордсета, фактически, нет доступных рлдителей. Вернее знал это, но хотелось всё же перехитрить это правило... Смирюсь...:{

258
22 января 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by XtreamAll


А почему не создать свою колекцию и туда добавлять все созданные Коннекшены...
... то же для Рекордсетов...



Кстати, да, очень здравая мысль, если так надо их структурировать, то заведи себе класс MyConnection, который будет содержать/вести коллекцию Connection, но тогда уже надо будет создавать и удалять эти Connection через свой класс MyConnection, в котором будут реализованы соответствующие методы.

Как недостаток - немного не привычно для других людей читать твой код, хотя если все методы также аккуратно перегрузить, то ничего не будет заметно, просто место Dim cn As Connection, будет Dim cn As MyConnection

258
22 января 2004 года
SergeySV
1.5K / / 19.03.2003
Ну вот, хитри, идея XtreamAll очень здравая и нетрудная в реализации.

P.S. конечно если у тебя уже готовый проект, то после введения этого класса придется полазить по коду и переделать Connection, но этот объект не так уж часто создается, чтобы это было очень большой проблемой. С другой стороны, такие вещт конечно надо продумывать заранее, а модернизировать уже готовый проект в 3 раз сложнее.
478
22 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by SergeySV


Кстати, да, очень здравая мысль, если так надо их структурировать, то заведи себе класс MyConnection, который будет содержать/вести коллекцию Connection, но тогда уже надо будет создавать и удалять эти Connection через свой класс MyConnection, в котором будут реализованы соответствующие методы.

Как недостаток - немного не привычно для других людей читать твой код, хотя если все методы также аккуратно перегрузить, то ничего не будет заметно, просто место Dim cn As Connection, будет Dim cn As MyConnection



Вот и я говорю...
...ежели чего, я присоединюсь к созданию сего шедевра...
...мене тоже такое нада!!!;)

319
22 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by XtreamAll


Вот и я говорю...
...ежели чего, я присоединюсь к созданию сего шедевра...
...мене тоже такое нада!!!;)


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

478
22 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by xelos

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



Согласен!
Но иногда есть задачи, для которых одного активного подключения маловато...
...а уж коллекция рекордсетов - ваще полезная штука!!!

319
22 января 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by XtreamAll


Согласен!
Но иногда есть задачи, для которых одного активного подключения маловато...
...а уж коллекция рекордсетов - ваще полезная штука!!!


Я просто много в VC++ пишу - от ООП уже не денешься никуда, это я насчет инкапсуляции :) по минимуму глобальных переменных :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог