2010-01-21 4 views
1

Donner un aperçu rapide de ma situation:Sérialisation .Net, XmlDataReader, une base de données SQL et FlagsAttribute!

Je travaille sur une application N-Tier qui repose beaucoup sur la sérialisation, les objets interagissent avec la base de données principalement de façon sérialisé, les objets et les collections sont insérés, mis à jour et lire comme XML à partir de procédures stockées.

Pour certaines des classes de données plus petites, j'utilise simplement ExecuteNonQuery, Reader, etc. pour interagir avec les données, car c'est plus facile, mais j'ai rencontré un problème.

Les données sont insérées dans la base de données à l'aide de ExecuteNonQuery, à l'aide de Paramètres - certaines des données insérées sont des propriétés qui sont Enums (stockées dans le DB comme ints) auxquelles FlagAttribute est attaché. Sur un Enum tels que:

<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 

La valeur lue de retour pourrait être une valeur entière de 1, 3, 7, etc, et inséré dans la base de données de ne pas utiliser la sérialisation, quand elle est lue en arrière mais dans le cadre d'un Un groupe plus grand de classes utilisant ExecuteXmlReader (qui remplit un objet XmlReader) et qui a ensuite besoin d'être désérialisé, ne peut pas, comme 7 par exemple, provoquer une erreur de validation d'instance: '7' n'est pas une valeur valide pour Fruit ', attend d'être publié en feuilleton dans le format:

<fruitOptions>1 2 4<fruitOptions> 

dans l'ensemble, il est un peu confus, et je pourrais probablement travailler autour d'elle en les stockant dans la base de données dans le 1, 2 , 4 format, mais malheureusement pas dans le type int dans lequel il est actuellement.

Est-ce que quelqu'un a des idées à ce sujet?

Répondre

0

Vous devrez demander à votre administrateur de base de données ou à l'auteur de la procédure stockée que vous utilisez. Il semble qu'ils ont spécifié que ce champ n'est pas une énumération, mais plutôt une liste.

+1

Les données sont stockées dans la base de données sous la forme d'un int, car nous espérions pouvoir ensuite effectuer des opérations au niveau du bit. Le problème est que lorsqu'il est désérialisé, il attend le résultat comme dans l'exemple ci-dessus, les nœuds du fruit - et ne peut donc pas le sérialiser. Il peut être stocké dans la base de données comme une chaîne de nombres, comme indiqué ci-dessus, mais nous ne pouvons pas effectuer d'opérations au niveau du bit et utiliser un autre type de données tel que XML pour l'interrogation des données. Bien que je préfère garder les données dans la base de données comme un type int, aucune idée de comment je peux le faire et encore utiliser la sérialisation? – Nathan

+0

@Nathan avez-vous déjà trouvé une solution à ce problème? – shadowf

Questions connexes