2010-11-03 8 views
0

Considérons une application Winforms connexion à une base de données SQL Server 2008 et l'exécution d'une instruction SQL SELECT:conversion de OleDbDataReader en resultset liste

string myConnectionString = "Provider=SQLOLEDB;Data Source=hermes;Initial Catalog=qcvaluestest;Integrated Security=SSPI;"; 

string mySelectQuery = "SELECT top 500 name, finalconc from qvalues where rowid between 0 and 25000;"; 

OleDbConnection myConnection = new OleDbConnection(myConnectionString); 

OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection); 

myCommand.Connection.Open(); 

OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 

Comment pouvez-vous lire les résultats de la requête dans une liste?

+0

quel type de liste? puisque vos deux valeurs de retour de votre requête recherchent comme un tableau ou comme une liste d'objets, ou une zone de liste? – Patrick

+0

un tableau s'il vous plaît –

+0

Quelle version de .Net utilisez-vous? –

Répondre

2

Supposons que vous avez défini une classe qui est quelque chose comme

class MyData 
{ 
    public string Name {get; set;} 
    public int FinalConc {get; set;} // or whatever the type should be 
} 

Vous itérer les résultats de votre requête pour charger une liste.

List<MyData> list = new List<MyData>(); 
while (myReader.Read()) 
{ 
    MyData data = new MyData(); 
    data.Name = (string)myReader["name"]; 
    data.FinalConc = (int)myReader["finalconc"]; // or whatever the type should be 
    list.Add(data); 
} 

// work with the list 

Si vous avez juste besoin d'un des champs donnés, vous pouvez renoncer à la définition de classe et ont simplement un List<T>, où T est le type de tout champ que vous voulez tenir.

2

Vous pouvez essayer quelque chose comme (l'adapter à votre convenance):

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

List<Person> dbItems = new List<Person>(); 

while(myReader.Read()) 
{ 
    Person objPerson = new Person(); 

    objPerson.Name = Convert.ToString(myReader["Name"]); 
    objPerson.Age = Convert.ToInt32(myReader["Age"]); 

    dbItems.Add(objPerson); 
} 
+0

Cela va transformer chaque ligne en plusieurs éléments de la liste. Donc donné deux colonnes, la première rangée serait dbItems [0] et dbItems [1], la deuxième rangée serait dbItems [2] et dbItems [3], etc. Est-ce intuitif? Que faire si les types des colonnes ne sont pas les mêmes? –

+0

@pycoder, c'est bon mais pas exactement correct, il crée juste un tableau 1 dimensionnel avec le premier élément columnname1 puis le second columnname2 puis le troisième column1, puis 2, puis 1 ... etc mais j'ai besoin (1, 2) (1, 2), (1,2). .... –

+0

ouch ... désolé. Mauvaise erreur de logique. – pyCoder

1

Liste de quoi? Avez-vous une configuration de classe qui a des propriétés pour name et finalconc? Dire que vous faites, et il ressemble à ceci:

public class QueryResult 
{ 
    public string Name { get; set; } 
    //not sure what finalconc type would be, so here just using string 
    public string FinalConc { get; set; } 
} 

alors vous faire quelque chose comme ceci:

var queryResults = new List<QueryResult>(); 
using(var myReader = myCommand.ExecuteReader()) 
{ 
    while(myReader.Read()) 
    { 
     queryResults.Add(new QueryResult 
      { 
       Name = myReader.GetString(myReader.GetOrdinal("name")), 
       FinalConc = myReader.GetString(myReader.GetOrdinal("finalconc")) 
      }); 
    } 
} 
Questions connexes