2017-05-24 4 views
0

Je souhaite stocker les valeurs des colonnes, c'est-à-dire les noms de colonne, et les valeurs de lignes d'une ligne spécifique dans deux listes distinctes. Provider et Document sont tous deux de List<string>. Mais comme il y a un conflit de type avec Document, j'utilise var Document, donc le compilateur l'accepte.C# - Essayer d'ajouter des valeurs de ligne à la liste throws InvalidOperationException

Le code suivant fonctionne parfaitement bien jusqu'à ce que var Document = Enumerable.Range(0, dr.FieldCount).Select(dr.GetValue).ToList();

OleDbCommand cmd = new OleDbCommand(abfrage, conn); 
OleDbDataReader dr; 
try 
{ 
    conn.Open(); 
    dr = cmd.ExecuteReader(); 
    Provider = Enumerable.Range(0, dr.FieldCount) 
         .Select(dr.GetName) 
         .ToList(); 
    // Following line will throw exception 
    var Document = Enumerable.Range(0, dr.FieldCount) 
          .Select(dr.GetValue) 
          .ToList(); 
    dr.Close(); 
    dr.Dispose(); 
}   
catch (System.InvalidOperationException inv) 
{ 
    MessageBox.Show(inv.Message); 
    throw; 
} 

La première liste a les noms de colonnes correctement stockées, mais l'autre jette un InvalidOperationException et dit qu'il n'y a pas de valeurs dans les lignes ou les colonnes . C'est correct pour certaines colonnes (elles sont vides). Je l'ai testé avec un autre DB-Table où chaque colonne/ligne a une valeur mais j'obtiens la même exception ici.

Qu'est-ce que je fais mal?

Merci d'avance!

Edit:

Voici deux captures d'écran qui montrent les valeurs lues par le lecteur.

Le premier avec les noms de colonnes (les valeurs sont grisées, il y a des données sensibles): first results

Le second avec les valeurs de toute la ligne: read values

Répondre

1

Vous devez appeler dr.Read() lire la première rangée des résultats.

En outre, votre Document dans ce code est une variable locale qui est jetée. Je devine que vous voulez l'assigner à une propriété du même nom? Vous devrez également convertir le résultat de dr.GetValue() en une chaîne.

Je pense que vous voulez à la fois Document et initialiser Provider et la méthode appel AddRange au lieu de les attribuer au résultat.

+0

J'ai essayé 'while (dr.Read()) { // var = document Enumerable.Range (0, dr.FieldCount) .Select (dr.GetValue) .Lister()); } 'et en effet il stocke/ajoute les valeurs à' var Document'. Aussi, comme vous l'avez dit, 'Document' est jeté. J'ai essayé de le lancer mais je ne suis pas sûr de savoir comment gérer ça. J'ai également essayé votre suggestion pour appeler le 'AddRange()' -Method sans succès. – Allix

+0

Je pense que je l'ai eu. Ce code fonctionne et 'Document' conserve les résultats:' IEnumerable Document; 'et' Document = Enumerable.Range (0, dr.FieldCount) .Select (dr.GetValue) .ToList(); '. Est-ce le bon/le meilleur moyen de le faire? – Allix

+0

@Allix, oui, de cette façon fonctionnera bien. Vous pourriez faire un document un IList . –

0

Essayez cette

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Data.OleDb; 

namespace ConsoleApplication57 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      OleDbConnection conn = new OleDbConnection("Enter Connection String Here"); 
      string abfrage = "Enter Query Here"; 
      OleDbCommand cmd = new OleDbCommand(abfrage, conn); 
      OleDbDataReader dr; 
      List<string> Provider = new List<string>(); 
      int colIndex = 3; 
      try 
      { 
       conn.Open(); 

       dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 

        Provider.Add(dr.GetString(colIndex)); 
       } 

       dr.Close(); 
       dr.Dispose(); 
      } 

      catch (System.InvalidOperationException inv) 
      { 
       MessageBox.Show(inv.Message); 
       throw; 
      } 
     } 
    } 
} 
+0

J'ai essayé 'while (dr.Read()) { Provider.Add (dr.GetString (colIndex)); } ' mais encore une fois il jette la même exception. Je ne comprends pas vraiment car la première liste obtient les bons résultats. – Allix

+0

Cela semble être lu dans toutes les lignes de Provider, alors que l'OP voulait seulement lire toutes les valeurs d'une ligne. –

+0

@RobinSalih Oui, c'est correct. Ma requête recherche une valeur spécifique dans une ligne (disons ID 5) et renvoie la ligne associée avec toutes les valeurs de colonne. – Allix