обычно это обращение к null-объектуИли к объекту, который открыт в транзакции, за пределами этой транзакции... Тут вариантов множество...
обычно это обращение к null-объектуиз документации следует, что это грубая ошибка, сродни NullException, но только обращение за границы, а не к Null
нельзя так делатьИменно то, о чем я и писал выше.
Так и есть!обычно это обращение к null-объектуИли к объекту, который открыт в транзакции, за пределами этой транзакции... Тут вариантов множество...
да, я уже понял ... нашел. Спасибо.нельзя так делатьИменно то, о чем я и писал выше.
то я сразу нашел transaction.Commit, который не в тех операторных скобках.он то как раз там где надо
Как только Вы сказали, то я сразу нашел transaction.Commit, который не в тех операторных скобках.У тебя в Common.cs полный бред, который даже сложно комментировать.
метод getBlockByNameFromDocument пока просто лежит, на будущее, я его не использую.Как только Вы сказали, то я сразу нашел transaction.Commit, который не в тех операторных скобках.У тебя в Common.cs полный бред, который даже сложно комментировать.
Например,Код - C# [Выбрать]1. Запускается транзакция, но нет ни transaction.Dispose() ни transaction.Commit()
public static BlockTableRecord getBlockByNameFromDocument(string blockName) { Transaction transaction = startTransaction(); BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead); foreach (ObjectId btrID in blockTable) { BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(btrID, OpenMode.ForWrite); if (btr.Name.ToUpper() == blockName.ToUpper()) { return btr; } } return null; }
2. Из метода возвращается BlockTableRecord, открытый в транзакции.
Т.е. нужно переделывать всё логику методов.
теперь в следующей команде AUTO_ELECTRO_CREATE_CABLE_LOG_ тоже Violation AccessНикогда не храни открытые объекты/примитивы - храни их ObjectId. И открывай по мере надобности.
У тебя в Common.cs полный бред, который даже сложно комментировать.обсуждалось здесь
нужно переделывать всё логику методов.зачем всю логику переделывать всех методов?
обсуждалось здесьага
для получения ObjectId того BlockTableRecord
зачем всю логику переделывать всех методов?Я не знаю как мне еще нужно объяснять про открытые примитивы/объекты вне транзакций, а у тебя это на каждом шагу. Не должно быть глобальных List<Polyline>, List<BlockReference> и т.д.
Никогда не храни открытые объекты/примитивы - храни их ObjectId. И открывай по мере надобности.не совсем понял о чем речь
не совсем понял о чем речьТы хранишь между запусками команд вот такое: List<BlockReference>, List<Polyline> - этого делать категорически нельзя. Вместо этого храни List<ObjectId> для вставок блоков и полилиний и если нужны их данные - открывай их по мере надобности.
этого делать категорически нельзяа я делаю ::)
а я делаюwEnt у тебя содержится в Database (т.е. ObjectId у него не null) или только в памяти?
Только в памяти ;D, а DrawEntity добавляет его в Database и возвращает ObjectId - с которым дальше и работаю!Ну так совсем другое дело...
Вместо этого храни List<ObjectId> для вставок блоков и полилиний и если нужны их данные - открывай их по мере надобности.c этого момента подробнее, пожалуйста... если можно, конечно
Честно сказать, у меня мозги "заплелись" немного ))Извини, но это единственно что я вынес из твоего сообщения. Не лезь в абстракции. Делай то, что я тебе подсказываю, иначе ты потратишь уйму времени на написание кода, который будет работать через раз и ты будешь создавать постоянно темы, аналогичные этой.
блин, неправильный пример... но ведь работаетДля объектов, открытых ForRead такое иногда работает. Но зачем наступать на грабли???
Прошу прощения за некропостинг, но может кто-то объяснит почему автор везде пихает static?1. Это не некропостинг - этой теме всего-то четыре месяца.