2012-01-13 6 views
1

Comment puis-je effectuer plusieurs mises à jour à l'aide de datatable?C# DataTable Mettre à jour plusieurs lignes

J'ai trouvé ce Update 1 row

mon code:

public void ExportCSV(string SQLSyntax, string LeFile, bool Is_Ordre, int TypeDonne) 
     { 
      try 
      { 
       using (var connectionWrapper = new Connexion()) 
       { 
        var connectedConnection = connectionWrapper.GetConnected(); 


        SqlDataAdapter da = new SqlDataAdapter(SQLSyntax, connectionWrapper.conn); 
        DataSet ds = new DataSet(); 
        da.Fill(ds, "Emp"); 
        DataTable dt = ds.Tables["Emp"]; 
        CreateCSVFile(dt, LeFile, Is_Ordre, TypeDonne); 

        //Update all lines, it not save in Database 
        foreach (DataRow row in dt.Rows) 
        { 
         row["IS_IMPORT"] = true; 
        } 
       } 
      } 
      catch (Exception excThrown) 
      { 
       throw new Exception(excThrown.Message); 
      } 



     } 

le problème est:

foreach (DataRow row in dt.Rows) 
         { 
          row["IS_IMPORT"] = true; 
         } 

-il pas l'enregistrer dans la base de données.

Merci vous à l'avance, Stev

+0

Attention: cette approche consomme beaucoup de mémoire. Si votre table contient plus de 1000 lignes (nombre arbitraire), vous aurez un impact important sur la mémoire. Pourquoi ne pas vous déplacer vers un SqlDataReader, qui peut lire les lignes par des lignes, puis ajouter une ligne de chaîne au fichier csv en utilisant un flux de fichier –

Répondre

3

vous mettez à jour la valeur en mémoire. La classe DataTable n'est pas une vue sql, mais une représentation de la mémoire. L'adaptateur de données Sql copie uniquement les données.

Vous devez réécrire les modifications apportées à la base de données. Essayez ceci:

public void ExportCSV(string SQLSyntax, string LeFile, bool Is_Ordre, int TypeDonne) 
    { 
     try 
     { 
      using (var connectionWrapper = new Connexion()) 
      { 
       var connectedConnection = connectionWrapper.GetConnected(); 


       SqlDataAdapter da = new SqlDataAdapter(SQLSyntax, connectionWrapper.conn); 

       da.UpdateCommand = connectedConnection.CreateCommand(); 
       da.UpdateCommand.XXXX = YYYY; // construct the SQL Command      

       DataSet ds = new DataSet(); 
       da.Fill(ds, "Emp"); 
       DataTable dt = ds.Tables["Emp"]; 
       CreateCSVFile(dt, LeFile, Is_Ordre, TypeDonne); 

       //Update all lines, it not save in Database 
       foreach (DataRow row in dt.Rows) 
       { 
        row["IS_IMPORT"] = true; 
       } 

       da.Update(dt); 
      } 
     } 
     catch (Exception excThrown) 
     { 
      throw new Exception(excThrown.Message); 
     } 
    } 

Cela devrait fonctionner.

+0

Merci pour votre réponse. Cela fonctionne bien. Juste une curiosité pourquoi j'ai besoin des deux: 'da.UpdateCommand.CommandText =" MISE À JOUR ORDRE SET IS_IMPORT = 'true' ";' et 'foreach (ligne DataRow dans dt.Rows) { row [" IS_IMPORT "] = true; } ' – user609511

+1

votre requête sql mise à jour ** toutes ** les données de la table. Vous devez générer une requête SQL que peut utiliser la méthode de mise à jour SqlDataAdapter. lorsque vous avez écrit 'row [" IS_import "] = true;' il marque la ligne comme étant mise à jour. L'appel à SqlDataAdapter.Update prendra toutes les lignes mises à jour de la table, puis lancera la commande de mise à jour correspondante. Suggestion: comme vous semblez découvrir ces cours, donnez la chance au concepteur de studio visuel de tout construire pour vous. –

+0

Merci pour votre explication ... – user609511

4

Vous devez d'abord définir la propriété UpdateCommand sur DataAdapter à l'instruction UPDATE qui sera exécuté pour mettre à jour une ligne dans la base de données. Puis, après la mise à jour des valeurs dans le DataTable, vous devez le transmettre à DataAdapter.Update(). Cela exécutera ensuite UpdateCommand pour chaque ligne mise à jour dans le DataTable.

Références:

MSDN - SqlDataAdapter.Update
MSDN - SqlDataAdapter.UpdateCommand

0

Vous devrez appeler da.Update()

Questions connexes