2009-02-19 6 views
0

EDIT: Voir ci-dessousQuelle classe pour les tableaux multidimensionnels sérialisables?

J'ai un service Web qui utilise une classe de fonctions afin de renvoyer des données utilisées dans divers processus d'affaires (via InfoPath).

L'une des fonctions prend un objet SQLCommand donné et l'exécute dans un SQLDataReader. Maintenant, selon le texte de la commande SQL utilisé, cela peut renvoyer une ou plusieurs lignes d'une ou plusieurs colonnes. Alors quelle est la meilleure classe pour cette fonction pour revenir en gardant à l'esprit qu'il doit être sérialisé par le service Web.

Mon code existant est:

Dim array As New ArrayList 

    Try 

     conCMS.Open() 
     Dim rdr As SqlDataReader = cmdCurrent.ExecuteReader 

     While rdr.Read 
      If rdr.VisibleFieldCount > 1 Then 
       Dim complexType(rdr.VisibleFieldCount - 1) As String 
       For rowIndex As Integer = 0 To rdr.VisibleFieldCount - 1 
        complexType(rowIndex) = rdr(rowIndex) 
       Next 
       array.Add(complexType) 
      Else 
       array.Add(rdr(0)) 
      End If 
     End While 
     conCMS.Close() 

     Return array 

    Catch ex As Exception 

     array.Add("ERROR " & ex.Message) 

    End Try 

    Return Nothing 

Maintenant, je sais que ce n'est pas un code efficace, mais un travail en cours.

Comme vous pouvez probablement le voir, cela génère un tableau de chaînes pour représenter une ligne avec plus d'une colonne, mais cela ne peut pas être sérialisé par le service Web.

Donc 2 choses vraiment;

  • Quelques conseils sur un type efficace d'utiliser (sans écrire une classe sérialisable de mon propre)
  • Quelques conseils sur l'amélioration du code à l'avenir.

Merci à l'avance

EDIT: j'ai réussi à obtenir sérialisation au travail en créant simplement un arrayList imbriqué comme suit (doh!):

If rdr.VisibleFieldCount > 1 Then 
    Dim complexType As New ArrayList 
    For rowIndex As Integer = 0 To rdr.VisibleFieldCount - 1 
     complexType.Add(rdr(rowIndex)) 
    Next 
    array.Add(complexType) 
    Else 
    array.Add(rdr(0)) 
    End If 

Cependant s'il vous plaît laissez-moi savoir comment cela pourrait être amélioré.

Répondre

1

Si votre code connaît le schéma des données renvoyées avant l'appel, vous devez retourner les données dans la même forme. Avoir une structure ou une classe avec des propriétés du type approprié pour chaque colonne des données renvoyées. Pour chaque ligne, créez une instance d'une telle structure et remplissez les propriétés à partir des colonnes renvoyées. Ajoutez ensuite chaque instance à une liste fortement typée de cette structure, List (Of T). Puis retournez la liste. OBTW, ArrayList a été créé avant que nous ayons des génériques dans .NET.

Aujourd'hui, il est préférable d'utiliser des collections fortement typées et non ArrayList, qui est essentiellement List (Of quoi que ce soit).

+0

Merci John, le problème avec ceci est que ce code pourrait renvoyer un nombre inconnu de colonnes d'une table inconnue. Ce code est très faiblement couplé aux données réelles derrière. Je ne peux donc pas créer de classe fixe pour définir les données renvoyées. – Charlie

+0

A noté votre point sur ArrayLists mais sans avoir une structure pour représenter les données je ne peux pas avoir un List (Of T) comme T devrait être Object et c'est juste une ArrayList de toute façon insn't il? – Charlie

Questions connexes