2010-01-21 9 views
1

Давать краткий обзор моей ситуации:. Чистая сериализация, XmlDataReader, база данных SQL и атрибут FlagsAttribute!

Я работаю над приложением N-Tier, опирающимся много на сериализации, объекты взаимодействуют с базой данных, главным образом, в упорядоченных модах, объекты и коллекции вставляются, обновляются и читать как XML из хранимых процедур.

Для некоторых небольших классов данных я просто использую ExecuteNonQuery, Reader и т. Д. Для взаимодействия с данными, так как это проще, но я столкнулся с проблемой.

Данные вставляются в базу данных с помощью ExecuteNonQuery, используя Parameters - некоторые из вставленных данных являются свойствами, которые являются Enums (хранятся в DB как int), к которым прикреплен FlagAttribute. Об одном Enum, такие как:

<Flags()> _ 
Public Enum Fruit As Integer 
    <Description("None"), XmlEnum("0")> None = 0 
    <Description("Apple"), XmlEnum("1")> Apple = 1 
    <Description("Banana"), XmlEnum("2")> Banana = 2 
    <Description("Orange"), XmlEnum("4")> Orange = 4 
End Enum 

Значение считаны может быть Целочисленное значение 1, 3, 7 и т.д., и вставлены в базу данных, не используя сериализации, когда она считывается обратно, однако как часть более крупную группу классов с использованием ExecuteXmlReader (заполнение объекта XmlReader), а затем ее нужно десериализовать, ее не может быть, поскольку, например, 7 вызывает «Ошибка проверки экземпляра:« 7 »не является допустимым значением для Fruit ', поскольку ожидает его сериализовать в формате:

<fruitOptions>1 2 4<fruitOptions> 

все в целом это немного сбивает с толку, и я мог бы работать вокруг него, сохраняя его в базе данных в 1, 2 , 4, но, к сожалению, нет в типе int, в котором он находится.

У кого-нибудь есть идеи по этому поводу?

ответ

0

Вам нужно будет спросить своего администратора базы данных или автора хранимой процедуры, которую вы используете. Похоже, они указали, что это поле не является перечислением, а скорее списком.

+1

Данные хранятся в БД как int, поскольку мы надеялись, что тогда мы сможем побитовые операции над ним. Проблема заключается в том, что она десериализована, она ожидает результат, как в приведенном выше примере, узлы фруктов - и, следовательно, не может его сериализовать. Он может быть сохранен в БД как строка чисел, как показано выше, но тогда мы не могли выполнять побитовые операции на нем и могли бы также использовать другой тип данных, например XML, чтобы помочь в запросе данных? Хотя я предпочитаю хранить данные в БД как тип int, любая идея, как я могу это сделать и по-прежнему использовать сериализацию? – Nathan

+0

@ Натан, вы когда-нибудь находили решение этой проблемы? – shadowf