2009-08-28 6 views
47

J'ai un DataTable qui est rempli à partir d'une requête SQL vers une base de données locale, mais je ne sais pas comment extraire des données de celui-ci. Méthode principale (dans le programme de test):Comment extraire des données d'un DataTable?

static void Main(string[] args) 
{ 
    const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;"; 
    DataTable table = new DataTable("allPrograms"); 

    using (var conn = new SqlConnection(connectionString)) 
    { 
     Console.WriteLine("connection created successfuly"); 

     string command = "SELECT * FROM Programs"; 

     using (var cmd = new SqlCommand(command, conn)) 
     { 
      Console.WriteLine("command created successfuly"); 

      SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

      conn.Open(); 
      Console.WriteLine("connection opened successfuly"); 
      adapt.Fill(table); 
      conn.Close(); 
      Console.WriteLine("connection closed successfuly"); 
     } 
    } 

    Console.Read(); 
} 

La commande I utilisé pour créer les tables dans ma base de données:

create table programs 
(
    progid int primary key identity(1,1), 
    name nvarchar(255), 
    description nvarchar(500), 
    iconFile nvarchar(255), 
    installScript nvarchar(255) 
) 

Comment puis-je extraire des données de la DataTable sous une forme significative à utiliser?

Répondre

115

Le DataTable a une collection .Rows d'éléments DataRow. Chaque DataRow correspond à une ligne de votre base de données et contient une collection de colonnes.

Pour accéder à une seule valeur, faire quelque chose comme ceci:

foreach(DataRow row in YourDataTable.Rows) 
{ 
    string name = row["name"].ToString(); 
    string description = row["description"].ToString(); 
    string icoFileName = row["iconFile"].ToString(); 
    string installScript = row["installScript"].ToString(); 
} 

Marc

+2

Je sais que c'est une vieille réponse, mais ne vous devez faire un casting dans la boucle foreach pour permettre l'indexation? Je ne pouvais pas faire quelque chose comme ça jusqu'à ce que je changé le code pour ressembler à ce qui suit: foreach (DataRow ligne dans YourDataTable.Rows.Cast ()) ... – awh112

+0

commentaire Même plus, mais il n'y a pas besoin lancer: 'foreach' fonctionne, car' Rows' est une collection ('DataRowCollection'). Cependant, vous devez utiliser '.Cast ()' si vous voulez utiliser des méthodes Linq ('.Where()', par exemple). –

+1

@marc_s Merci –

16

Vous pouvez définir le datatable en tant que source de données pour de nombreux éléments.

Pour exemple

GRIDVIEW

répéteur

datalist

etc etc

Si vous avez besoin d'extraire des données de chaque ligne vous pouvez alors utiliser

table.rows[rowindex][columnindex] 

ou

si vous connaissez le nom de la colonne

table.rows[rowindex][columnname] 

Si vous devez itérer la table, vous pouvez utiliser une boucle ou une boucle foreach comme

for (int i = 0; i < table.rows.length; i ++) 
{ 
    string name = table.rows[i]["columnname"].ToString(); 
} 

foreach (DataRow dr in table.Rows) 
{ 
    string name = dr["columnname"].ToString(); 
} 
+0

foreach (DataRow dr dans le tableau) table.Rows – StampedeXV

3

Sauf si vous avez une bonne raison de faire ado.net cru je jeter un oeil à l'aide d'un ORM (objet relationnel mapper) comme nhibernate ou Linq to Sql. De cette façon, vous pouvez interroger la base de données et récupérer des objets pour travailler avec qui sont fortement typés et plus faciles à travailler avec IMHO.

Colin G

+1

Je reçois une connaissance de base de ADO.net avant de passer à un ORM comme suggéré par http://stackoverflow.com/questions/1345508/how-do-i-connect-to-a- sql-database-from-c/1345531 # 1345531 – RCIX

4

S'il vous plaît pensez à utiliser un code comme ceci:

SqlDataReader reader = command.ExecuteReader(); 
int numRows = 0; 
DataTable dt = new DataTable(); 

dt.Load(reader); 
numRows = dt.Rows.Count; 

string attended_type = ""; 

for (int index = 0; index < numRows; index++) 
{ 
    attended_type = dt.Rows[indice2]["columnname"].ToString(); 
} 

reader.Close(); 
0
var table = Tables[0]; //get first table from Dataset 
    foreach (DataRow row in table.Rows) 
    { 
     foreach (var item in row.ItemArray) 
     { 
      console.Write("Value:"+item); 
     } 
    } 
0

S'il vous plaît, notez que Ouvrir et fermer la connexion n'est pas nécessaire lors de l'utilisation DataAdapter.

Je suggère donc de mettre à jour ce code s'il vous plaît et de supprimer l'ouverture et la fermeture de la connexion:

 SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

conn.Open(); // cette ligne de code est uncessessary

 Console.WriteLine("connection opened successfuly"); 
     adapt.Fill(table); 

conn.Close(); // cette ligne de code est uncessessary

 Console.WriteLine("connection closed successfuly"); 

Reference Documentation

Le code indiqué dans cet exemple ne pas explicitement ouvrir et fermer la connexion . La méthode Fill ouvre implicitement la connexion que le DataAdapter utilise s'il détecte que la connexion n'est pas déjà ouverte . Si Fill a ouvert la connexion, il ferme également la connexion lorsque le remplissage est terminé. Cela peut simplifier votre code lorsque vous traitez avec une seule opération telle qu'un remplissage ou une mise à jour. Toutefois, si vous effectuez plusieurs opérations qui nécessitent une connexion ouverte, vous pouvez améliorer les performances de votre application en appelant explicitement la méthode Open de la connexion, en effectuant les opérations sur la source de données , puis en appelant la méthode Close de la connexion. Vous devriez essayer de garder les connexions à la source de données ouvertes aussi brièvement que possible afin de libérer des ressources pour une utilisation par d'autres applications client.

Questions connexes