2011-11-09 6 views
0

ADO.NET - Updating Multiple DataTablesSqlDataAdapter plusieurs tables et transactions

Je trouve la question ci-dessus qui est exactement ce que je cherche et d'essayer de mettre en œuvre une solution ...

Je suis en train de voir une meilleure solution pour la mise à jour multiples table dans sqlserver 2008 et assurer la transaction sur les tables multiples. Si l'insertion dans une table échoue, annulez les mises à jour précédentes sur d'autres tables.

  1. SqlDataAdapter met à jour une seule table à la fois
  2. Je sais que nous pouvons faire la transaction sur un DataAdapter à la fois, mais besoin de mettre à jour plusieurs tables

modifiés ci-dessous sont les codes de la réponse fournie ci-dessus , mais il erreur avec le dataadapter. Je pense que je dois définir les commandes d'insertion, de mise à jour et de suppression, mais je ne sais pas comment cela fonctionne s'il y a plusieurs tables ??? quelqu'un peut-il remplir le lien manquant?

 using (SqlConnection con = new SqlConnection(SqlServerConnectionString)) 
     { 
      con.Open(); 
      //table is an array of datatable and contains data to be inserted 
      for (int i = 0; i < table.Length; i++) 
      { 
       ds.Tables.Add(table[i]); 
      } 

      SqlTransaction trans = con.BeginTransaction(); 

      SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
      //Need to set insert,select, update, delete???? on multiple tables? 

      //dataAdapter.Fill(ds); 
      dataAdapter.InsertCommand.Transaction = trans; //null object error here 
      dataAdapter.UpdateCommand.Transaction = trans; 
      dataAdapter.DeleteCommand.Transaction = trans; 

      try 
      { 

       dataAdapter.Update(ds); 
       trans.Commit(); 
      } 
      catch(Exception ex) 
      { 
       trans.Rollback(); 

      } 
+0

Lisez le 2ème commentaire de cette réponse. – LarsTech

+0

Je l'ai lu plusieurs fois avant de poster; Malheureusement, je suis toujours confus. Mais à la recherche de meilleures pratiques de mise en œuvre de ce ... – wirble

Répondre

0

Vous avez besoin de définir des commandes pour chacun de ces - je suggère d'utiliser SqlCommandBuilder pour le travail.

Notez, cependant, que SqlDataAdapter ne fonctionne que sur un DataTable. Pas évident dans la documentation si c'est la première table:

La méthode Update extrait les lignes de la table répertoriée dans le premier mappage avant d'effectuer une mise à jour.

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

... Ou peut-être juste la seule table dans le DataSet nommé Tableau:

Mise à jour | Appelle les instructions INSERT, UPDATE ou DELETE respectives pour chaque ligne insérée, mise à jour ou supprimée dans le DataSet spécifié à partir d'un DataTable nommé "Table".

http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

Dans tous les cas, votre boucle sur les tables va devoir appeler mise à jour, si vous utilisez un SqlDataAdapter.

EDIT

Dans tous les cas, le SqlDataAdapter est pas un bon choix ici, pour autant que je peux dire. Si tout ce que vous essayez de faire est de partager une transaction entre DataTables, utilisez simplement une série de SqlCommands qui partagent une SqlTransaction.

(si cela ne suffit pas clair, je vais ajouter un exemple de code quand je travaille)

+0

Je comprends que l'adaptateur de données fonctionne pour une table, mais à partir de la question précédente et la réponse; il semble que nous pouvons utiliser un Dataset avec plusieurs tables pour faire la mise à jour de la transaction. Peut-être que ce n'est pas le cas. Je sais comment faire une boucle sur chaque adaptateur de données et ajouter la table, puis appeler la mise à jour. Mais je veux mettre à jour plusieurs tables dans une transaction? Est-ce que les meilleures pratiques est alors d'utiliser SqlCommandBuilder pour les mises à jour de transactions de plusieurs tables? Il n'y a aucun moyen de faire cela pour Sqldataadapter et l'ensemble de données? – wirble

+0

Vous pouvez réutiliser la transaction pour plusieurs commandes SQL. Voir mon edit ... – sq33G

1

Merci pour les commentaires de chacun. Je pense que la réponse précédente par @Charlie avec ce q/a m'a égaré: ADO.NET - Updating Multiple DataTables

Je pensais que peut-être vous pouvez utiliser un ensemble de données pour les mises à jour, mais je suppose que vous devez encore créer un adaptateur de données supplémentaires, puis appelez mise à jour.Donc, la réponse à la question précédente est la seule autre façon de simplifier ce que @ gamzu07 voulait faire est d'utiliser un tableau plutôt que de le déclarer à chaque fois. Le code ci-dessous fonctionne mais me semble retardé, est-ce que quelqu'un a une meilleure idée que de construire les commandes d'insertion et d'exécuter cela ...?

  SqlDataAdapter[] dataAdapter = new SqlDataAdapter[table.Length]; 

      for (int i = 0; i < table.Length; i++) 
      { 

       dataAdapter[i] = new SqlDataAdapter("select * from " + table[i].TableName, con); 
       SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter[i]); 
       dataAdapter[i].InsertCommand = cb.GetInsertCommand(); 
       dataAdapter[i].Fill(table[i]); 

      } 

      SqlTransaction trans = con.BeginTransaction(); 

      try 
      { 
       for(int i=0;i < table.Length;i++){ 
        dataAdapter[i].InsertCommand.Transaction = trans; 
        dataAdapter[i].Update(table[i]); 
       } 
       trans.Commit(); 
      } 
      catch(Exception ex) 
      { 
       trans.Rollback(); 
      } 
+0

J'utilise moi-même la solution Wirble. Toutefois, notez que DataAdapter.Update() exécutera sqlcommand pour chaque DataRow unique et modifiera leur état, mais lorsque votre transaction sera annulée, ces DataRowStates modifiés seront obsolètes. Vous devez donc faire attention à utiliser cette solution lorsque vous accédez à la propriété DataRowState dans votre code. – SuperLucky

Questions connexes