У моего веб-сайта есть настройка, при которой при запуске приложения «SiteContent» «создается». При этом запускается функция очистки, которая в основном удаляет все ненужные данные из базы данных, в случае если они были оставлены там от ранее запущенных функций.
Модуль имеет экземпляры классов Manager, а именно RangeManager, CollectionManager, DesignManager. Есть и другие, но я буду использовать их в качестве примера. Каждый класс Manager содержит массив элементов - элементы могут иметь тип Range, Collection или Design, в зависимости от того, какой из них актуален. Данные для каждого диапазона затем считываются в экземпляр Range, Collection или Design. Я знаю, что это в основном дублирование данных - не очень эффективное, но это мой последний годовой проект на данный момент, поэтому я всегда могу поменять его на использование Linq или чего-то подобного позже, когда на меня не давит месячный срок.
У меня есть форма, которая при нажатии кнопки Сохранить сохраняет данные, вызывая SiteContent.RangeManager.Create (vars) или SiteContent.RangeManager.Update (Range As Range, vars) (или эквивалент для других классов менеджера, в зависимости от того, что один оказывается актуальным).
Эти функции вызывают хранимую процедуру для вставки или обновления в соответствующей таблице.
Классы Range, Collection и Design имеют атрибуты, такие как Name, Description, Display и некоторые другие. При вызове функции «Создать или обновить» диспетчер просматривает все остальные элементы, чтобы проверить, существует ли уже элемент с таким именем. Функция Update гарантирует, что она не сравнивает обновляемый элемент с самим собой. Настраиваемое исключение (ItemAlreadyExistsException) выдается, если найден другой элемент с тем же именем.
По какой-то странной причине, если я захожу в Range, Collection или Design в режиме редактирования, изменяю что-то и пытаюсь обновить его, он иногда не обновляет элемент. Когда я говорю иногда, я имею в виду каждые 3-4 страницы, иногда больше. Я не вижу абсолютно никакой картины в том, когда или почему это происходит. У меня есть оператор try-catch, который перехватывает ItemAlreadyExistsException и выдает «Элемент с таким именем уже существует» при перехвате. Иногда это будет выводить это; в других случаях это не так.
Кто-нибудь знает, почему это может произойти? Может быть, ошибка, которую кто-то сделал и решил раньше?
Раньше у меня были регулярные выражения, с которыми сравнивались имена - я думаю, что это было [a-zA-Z] {1, 100} (от 1 до 100 символов в нижнем или верхнем регистре). По какой-то причине клиент, для которого я разрабатываю сайт, использовал ошибки, сообщающие, что он не в правильном формате. Тем не менее он мог попробовать тот же текст 5 минут спустя, и он будет работать нормально. Я думаю, что это вполне может быть одной и той же проблемой, поскольку обе проблемы возникают случайным образом.
Большое спасибо заранее.
С уважением,
Ричард Кларк
Edit: После долгого времени, потраченного на сужение кода, я решил подождать, пока мой брат, который был программистом по крайней мере на 8 лет больше, чем я, приедет на Пасху и заставит его взглянуть на него. Если он не может решить эту проблему, тогда я заархивирую файлы и положу их куда-нибудь, чтобы люди могли получить к ним доступ.
Я сузил его буквально до минимально возможного количества файлов, и это все еще происходит. Кажется, примерно каждый десятый раз. Сказав это, я заставляю классы менеджера обновляться каждые 10 загрузок страницы или 5 минут (в зависимости от того, что наступит раньше). Я могу посмотреть на это - это может вызвать проблемы. В основном каждый менеджер содержит массив объекта. Этот массив заполняется с использованием данных из базы данных. Функция Update берет экземпляр элемента и новые значения, которые должны быть установлены для объекта. Если это происходит при загрузке страницы, когда массив сбрасывается (т. Е. Данные загружаются заново из базы данных), то экземпляр объекта с тем же идентификатором не будет тем же, что и передаваемый. Это объясняет тот факт, что время от времени создает исключение ItemAlreadyExistsException. Теперь все имеет смысл, чем больше я об этом думаю. Если бы я передал идентификатор объекта, который нужно изменить, а не сам объект, то он должен работать идеально. Я отвечу на вопрос, если я его решу ..