Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) OLE DB: закрытие команды оставляет открытыми файлы (число прочтений - 4835 )
rustamakhmetov
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 20. Декабря 2006
OLE DB: закрытие команды оставляет открытыми файлы
02. Февраля 2007 :: 07:39
Печать  
Ситуация:
Есть 2 базы, на 1й пользователь запускает обработку, которая выполняет OLE DB запрос. Команда закрывается через cmd.Закрыть();

Но на сервере, где установлена 2я база, в "Управление компьютером/Открытые файлы" остаются открытые файлы в режиме "чтение+запись", блокировка = 0 и в результате в конце дня не выполняется переиндексация, если пользователь с 1й базы не закрыл обработку.

Это решаемо? или нужно после выполнения запроса закрывать и соединение?

Спасибо!
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #1 - 02. Февраля 2007 :: 07:47
Печать  
Можно выполнить ХП, в которой будет команда
CLOSE TABLES ALL
Тогда все, типа, закроется Улыбка
  
Наверх
 
IP записан
 
rustamakhmetov
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 20. Декабря 2006
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #2 - 02. Февраля 2007 :: 08:29
Печать  
Uzhast писал(а) 02. Февраля 2007 :: 07:47:
Можно выполнить ХП, в которой будет команда
CLOSE TABLES ALL
Тогда все, типа, закроется Улыбка


у меня провайдер "Visual FoxPro", база dbf, такую команду "CLOSE TABLES ALL" не понимает.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #3 - 02. Февраля 2007 :: 08:44
Печать  
а если при завершении обработки вставить
<ODBC>ОбъектУстановившийСоединение.Закрыть();
Сообщить(""+?(ОбъектУстановившийСоединение.ЕстьСоединение()=1,"не закрыто","закрыто"));

ЕстьСоединение / IsConnected
Возвращает: тип: Число. 1 - объект подключен к источнику данных, 0 - не подключен

и заодно проверить

Сообщить(""+ОбъектУстановившийСоединениеПолучитьОписаниеОшибки());

а вдруг ошибка происходит



  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #4 - 02. Февраля 2007 :: 08:58
Печать  
rustamakhmetov писал(а) 02. Февраля 2007 :: 08:29:
у меня провайдер "Visual FoxPro", база dbf, такую команду "CLOSE TABLES ALL" не понимает.

Все он понимает. Я же про ХП говорил? Говорил. Вот и делай ХП с такой командой.

PS. На случай, если не знаешь, как для фокса ХП делать... Создаешь файл CloseTables.prg в каталоге базы, к которой выполняются запросы. Содержимое такое:
Код
Выбрать все
PROCEDURE CloseTables ()
CLOSE TABLES ALL
ENDPROC 



Далее просто выполняем запрос "exec CloseTables ()".
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #5 - 02. Февраля 2007 :: 09:01
Печать  
lustin писал(а) 02. Февраля 2007 :: 08:44:
а если при завершении обработки вставить
<ODBC>.Закрыть();

Товарищ! Хде ты тут нашел ODBC?!  Улыбка
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #6 - 02. Февраля 2007 :: 09:02
Печать  
Uzhast писал(а) 02. Февраля 2007 :: 08:58:
rustamakhmetov писал(а) 02. Февраля 2007 :: 08:29:
у меня провайдер "Visual FoxPro", база dbf, такую команду "CLOSE TABLES ALL" не понимает.

Все он понимает. Я же про ХП говорил? Говорил. Вот и делай ХП с такой командой.

PS. На случай, если не знаешь, как для фокса ХП делать... Создаешь файл CloseTables.prg в каталоге базы, к которой выполняются запросы. Содержимое такое:
Код
Выбрать все
PROCEDURE CloseTables ()
CLOSE TABLES ALL
ENDPROC 


Далее просто выполняем запрос "exec CloseTables ()".


А в качестве ликбеза можно вопрос:

а метод Закрыть() каким образом действует?
я так понимаю что он и есть аналог CLOSE TABLES ALL, тогда может выявить почему он не работает

Или я опять не про то и не так? Озадачен

  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #7 - 02. Февраля 2007 :: 09:05
Печать  
lustin писал(а) 02. Февраля 2007 :: 09:02:
А в качестве ликбеза можно вопрос:

а метод Закрыть() каким образом действует?
я так понимаю что он и есть аналог CLOSE TABLES ALL, тогда может выявить почему он не работает

Или я опять не про то и не так? Озадачен


Автор темы говорит про OLE DB и не хочет закрывать соединение. Вот и предлагается путь освобождения таблиц без закрытия соединения.
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #8 - 02. Февраля 2007 :: 09:16
Печать  
Uzhast писал(а) 02. Февраля 2007 :: 09:05:
Автор темы говорит про OLE DB и не хочет закрывать соединение. Вот и предлагается путь освобождения таблиц без закрытия соединения.


Упс...
Подвело меня cmd.Закрыть() - я вдруг подумал что соединение пытается ЗАКРЫВАТьСЯ но не Закрывается
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
rustamakhmetov
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 21
Зарегистрирован: 20. Декабря 2006
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #9 - 02. Февраля 2007 :: 14:03
Печать  
Uzhast писал(а) 02. Февраля 2007 :: 08:58:
PS. На случай, если не знаешь, как для фокса ХП делать... Создаешь файл CloseTables.prg в каталоге базы, к которой выполняются запросы. Содержимое такое:
Код
Выбрать все
PROCEDURE CloseTables ()
CLOSE TABLES ALL
ENDPROC 



Далее просто выполняем запрос "exec CloseTables ()".


Огромнейшее спасибо!!!
Все заработало, как надо!!!  Улыбка
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #10 - 02. Февраля 2007 :: 15:49
Печать  
Изначально я думал, что это проблема в коде, но потом попробовал тоже самое выполнить через ADODB - результат тот же, файл не отпускается.
Думае, что решение должно быть другое, отличное от ХП Улыбка
  
Наверх
ICQ  
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #11 - 02. Февраля 2007 :: 17:10
Печать  
По идалогии OLEDB (да и не только, в других клиентах СУБД тоже: ODBC, ADO, ADO .NET) существует два ключевых объекта: соединение и команда. Открытие/закрытие БД идет изменением состояния объекта соединения. А объекты команд существуют в рамках объекта соединения, и вообще говоря не имеют связи с какими-то определенными объектами БД (таблицами например).
В данном случае провайдер просто пытается оптимизировать свою работу, кешируюя свои ресурсы (в данном случае дескрипторы открытых файлов) в рамках открытого подключения к БД. А оптимизация идет всегда и везде в рамках соединения, а не команды. Провайдер пытается сэкономить на повторных открытиях файлов при последующих запросах, при этом не имеет никакого значения на каком экземпляре команды это будет происходить. Такое поведение - это традиция и вполне обоснованная и правильная. Полное освобождение ресурсов произойдет при закрытии соединения.
CLOSE TABLES ALL - это уже какраз специфика конкретного провайдера. Так что в данной задаче имхо это именно то, что нужно применять.
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #12 - 03. Февраля 2007 :: 09:44
Печать  
А еще можно в ОлеДБ в 1С++ добавить метод "ЗакрытьОткрытыеФайлы" - просто и удобно
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #13 - 03. Февраля 2007 :: 10:18
Печать  
не нужно.
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: OLE DB: закрытие команды оставляет открытыми ф
Ответ #14 - 05. Февраля 2007 :: 05:21
Печать  
artbear писал(а) 03. Февраля 2007 :: 09:44:
А еще можно в ОлеДБ в 1С++ добавить метод "ЗакрытьОткрытыеФайлы" - просто и удобно


а зачем? можно просто обнулить переменные
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать