2017-08-15 4 views
-1

J'ai un code à lire de la table de base de données vers la grille de données, mais il ne s'exécute qu'une seule fois et ajoute la ligne supérieure à la grille de données de la base de données. Est-il possible de l'exécuter plusieurs fois pour lire les données de différentes lignes et les ajouter dans mon DataGrid.Comment faire une boucle dans la table de base de données pour ajouter des données dans DataGrid?

public static void AddData(DataGrid datagrid) 
{ 
     SqlConnection connect = GetConnection(); 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connect; 

     //connect to database 
     connect.Open(); 
     command.CommandText = "Select req_status From TH_request where req_status = 'N'"; 
     command.ExecuteNonQuery(); 
     status = (String)command.ExecuteScalar(); 
     connect.Close(); 

     connect.Open(); 
     command.CommandText = "Select req_date_time From TH_request where req_status = 'N'"; 
     command.ExecuteNonQuery(); 
     time = (DateTime)command.ExecuteScalar(); 
     connect.Close(); 

     connect.Open(); 
     command.CommandText = "Select resp_user_name From TH_request where req_status = 'N'"; 
     command.ExecuteNonQuery(); 
     locationName = (String)command.ExecuteScalar(); 
     connect.Close(); 

     collection.Add(new DataObject() 
     { 
      A = time, 
      B = locationName, 
      C = status, 
      D = respUserName 
     }); 
     datagrid.ItemsSource = collection; 

} 
+2

instruction Select pourrait être suivie par plus d'un nom de domaine. _Sélectionnez req_status, req_date_time, resp_user_name de .... where ...._ Ensuite, vous utilisez SqlDataReader pour obtenir les champs du jeu de résultats retourné. C'est la programmation ADO.NET de base. Vous devriez probablement vous arrêter un peu dans vos efforts de codage et revoir un tutoriel sur ADO.NET. – Steve

+2

Vous devriez * vraiment * commencer par quelques tutoriels à ce sujet. Vous êtes déjà en train d'interroger la base de données * trois fois * quand vous avez seulement besoin de * une fois *. Envelopper cela dans une boucle va juste l'interroger une tonne plusieurs fois. Au lieu de cela, interrogez la base de données * une fois * pour obtenir le jeu de résultats complet dont vous avez besoin, puis liez le (s) contrôle (s) d'interface utilisateur à cet ensemble de résultats. – David

+0

Votre code fonctionne. La DGV ne se met pas à jour, vous devez donc utiliser une astuce. simplement datagrid.ItemsSource = null; puis datagrid.ItemsSource = collection; – jdweng

Répondre

0

Vous ne devez exécuter qu'une seule commande. Vous pouvez alors par exemple utiliser un SqlDataReader pour créer un DataObject pour chaque ligne qui a été renvoyée de la requête:

public static void AddData(DataGrid datagrid) 
{ 
    collection.Clear(); 
    using (SqlConnection connection = GetConnection()) 
    { 
     using (SqlCommand command = new SqlCommand("Select req_status, req_date_time, resp_user_name From TH_request where req_status = 'N'", connection)) 
     { 
      connection.Open(); 
      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        collection.Add(new DataObject() 
        { 
         A = Convert.ToDateTime(reader["req_date_time"]), 
         B = Convert.ToString(reader["resp_user_name"]), 
         C = Convert.ToString(reader["req_status"]), 
         D = respUserName 
        }); 
       } 

      } 
     } 
    } 
    datagrid.ItemsSource = collection; 
} 
+0

Cela a fonctionné merci beaucoup. – metadata