Открытие объектов без использования транзакции.

Автор Тема: Открытие объектов без использования транзакции.  (Прочитано 36392 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте.
Интересует как правильно выполнять открытие объектов для чтения свойств без использования транзакций. Так как такой подход является в последнее время нерекомендуемым, информации по правильному использованию этой возможности не найти нигде.
В интернете есть примеры с использованием методов ObjectId.Open/Close и с использованием OpenCloseTransaction.
Вопросы по первому способу:
Встречал такие варианты:
1.
Код - C# [Выбрать]
  1. try
  2. {
  3.     DBObject dbObj = objId.Open(OpenMode.ForRead);
  4.     // <как-то используем объект>
  5.     DBObject.Close();
  6.     DBObject.Dispose();
  7. }
  8. catch
  9. {
  10.     // <Обработка исключения>
  11. }
2.
Код - C# [Выбрать]
  1. using (DBObject dbObj = objId.Open(OpenMode.ForRead))
  2. {
  3.     // <как-то используем объект>
  4. }
Как наиболее правильно и безопасно применять?

Метод Open помечен как "нерекомендуемый", чем это может грозить?

По второму способу:
Нужно ли выполнять Commit для такой транзакции, если объекты не изменяются? Влияет ли это как-то на быстродействие? Какие есть ограничения применения? А ограничения какие-то должны быть, потому что, когда я просто изменил в своем коде Transaction на OpenCloseTransaction, а StartTransaction на StartOpenCloseTransaction, у меня программа стала вызывать фатальную ошибку в AutoCAD (Civil 3D - может это важно). Вернул все обратно - ошибка пропала. Причем в режиме отладки эта ошибка не отлавливается :(

В общем, буду благодарен за любую информацию по теме! Может быть, есть какие-то полезные статьи или материалы по этому вопросу?
Заранее спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Как наиболее правильно и безопасно применять?
Второй вариант. Первый вариант совсем небезопасный, так еще и неграмотно записан и .Dispose() не нужен. Это тоже самое что дважды вызвать .Close()
Нужно ли выполнять Commit для такой транзакции, если объекты не изменяются?
Во втором варианте у тебя нет никакой транзакции, так что .Commit() не нужен. Да и кому ты будешь его делать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
А ограничения какие-то должны быть, потому что, когда я просто изменил в своем коде Transaction на OpenCloseTransaction, а StartTransaction на StartOpenCloseTransaction, у меня программа стала вызывать фатальную ошибку в AutoCAD (Civil 3D - может это важно). Вернул все обратно - ошибка пропала. Причем в режиме отладки эта ошибка не отлавливается :(
Скорее всего у тебя что-то в коде некорректно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
То есть, я правильно понимаю, что для варианта ObjectId.Open/Close, DBObject.Close() то же самое, что и DBObject.Dispose()? Или DBObject.Dispose() включает в себя DBObject.Close()?
Цитировать
Да и кому ты будешь его делать?
Не знаю... Метод есть же :)
Commit вообще не надо использовать, или не надо использовать только когда не меняю объектов?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Не знаю... Метод есть же :)
Метод есть у транзакции, а транзакции у тебя нет!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Commit вообще не надо использовать, или не надо использовать только когда не меняю объектов?
Commit - это метод транзакции. У Entity/DBObject таких методов нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Опять запутали с Бушманом на пару ???
Метод есть у транзакции, а транзакции у тебя нет!
Андрею надо поправить пример 3.1 http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Цитировать
Скорее всего у тебя что-то в коде некорректно.
Там было внутри использование еще одной транзакции во вспомогательном методе. Я ее тоже заменил на OpenCloseTransaction, ошибка больше не выскакивает. Получается, что совместное использование OpenCloseTransaction и Transaction может приводить к конфликтам?
Цитировать
Commit - это метод транзакции. У Entity/DBObject таких методов нет.
Я имел в виду, нужно ли вызывать этот метод для OpenCloseTransaction?
Цитировать
Из примеров:
Спасибо! Буду изучать/пробовать.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Я имел в виду, нужно ли вызывать этот метод для OpenCloseTransaction?
В этом случае - да. Но код второго примера у тебя без транзакции - на это я и отвечал.
Получается, что совместное использование OpenCloseTransaction и Transaction может приводить к конфликтам?
Да. Так лучше не делать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрею надо поправить пример 3.1 http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html?
Там всё в порядке - у него есть транзакция.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Андрею надо поправить пример 3.1 http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html?
Какая хорошая статья! Почему-то я ее поиском не нашел, хотя помнил, что у Андрея что-то такое было... Спасибо!

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Еще, похоже, что метод ObjectId.GetObject не работает, если запущена не транзакция, а ее эмуляция с помощью OpenCloseTransaction.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще, похоже, что метод ObjectId.GetObject не работает, если запущена не транзакция, а ее эмуляция с помощью OpenCloseTransaction.
Да. ObjectId.GetObject требует чтобы была запущена реальная транзакция.
Кстати, по поводу вложенных OpenCloseTransaction. Если в таких транзакциях объекты только для чтения, то в принципе вложенные транзакции возможны. Есть четкие ограничения:
1) открытый для чтения объект может быть повторно открыт еще для чтения (но не больше чем 255 раз);
2) открытый для чтения объект не может быть повторно открыт для записи;
2) открытый для записи объект не может быть повторно открыт никак.
Немного упрощенно, но так.
Для обычной транзакции этих условий нет.
« Последнее редактирование: 29-08-2014, 18:17:40 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Спасибо!
Интересно, Вы это опытным путем установили (255 открывали на чтение? :) ) или где-то есть материалы по этому вопросу?
И можно ли как-то проверить, что объект уже открыт на чтение или запись?