2011-05-04 4 views
1

J'ai un code comme ceci:ADO.NET - Mise à jour de plusieurs DataTables

 DataSet dataSet = new DataSet();    
     DataTable dataTable1 = new DataTable("Table1"); 
     DataTable dataTable2 = new DataTable("Table2"); 
     DataTable dataTable3 = new DataTable("Table3"); 
     DataTable dataTable4 = new DataTable("Table4"); 
     dataSet.Tables.Add(dataTable1); 
     dataSet.Tables.Add(dataTable2); 
     dataSet.Tables.Add(dataTable3); 
     dataSet.Tables.Add(dataTable4); 

     SqlDataAdapter dataAdapter1 = new SqlDataAdapter("SELECT * FROM Table1 WHERE ID = 1", sqlConnection); 
     SqlDataAdapter dataAdapter2 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table2", sqlConnection); 
     SqlDataAdapter dataAdapter3 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table3", sqlConnection); 
     SqlDataAdapter dataAdapter4 = new SqlDataAdapter("SELECT Column1, Column2, Column3 FROM Table4", sqlConnection); 

     SqlCommandBuilder commandBuilder1 = new SqlCommandBuilder(dataAdapter1); 
     SqlCommandBuilder commandBuilder2 = new SqlCommandBuilder(dataAdapter2); 
     SqlCommandBuilder commandBuilder3 = new SqlCommandBuilder(dataAdapter3); 
     SqlCommandBuilder commandBuilder4 = new SqlCommandBuilder(dataAdapter4);    

     dataAdapter1.Fill(dataTable1); 
     dataAdapter2.FillSchema(dataTable2, SchemaType.Source); 
     dataAdapter3.FillSchema(dataTable3, SchemaType.Source); 
     dataAdapter4.FillSchema(dataTable4, SchemaType.Source); 

     //do a bunch of code that updates the one row from Table1 
     //and adds lots of new rows to Table2, Table3, Table4 

     dataAdapter1.Update(dataTable1); 
     dataAdapter2.Update(dataTable2); 
     dataAdapter3.Update(dataTable3); 
     dataAdapter4.Update(dataTable4); 
     dataSet.AcceptChanges(); 

Y at-il de toute façon de faire cela beaucoup plus simple? Que se passerait-il si l'ordinateur plantait sur la ligne après "dataAdapter2.Update (dataTable2);"? Je voudrais être en mesure d'utiliser en quelque sorte un seul appel Update pour tout mettre à jour. Est-ce possible?

Aussi, est-ce encore la meilleure façon de le faire? Avec "ceci" étant la création d'un tas de nouvelles lignes dans plusieurs tables en fonction de ce qui est dans une ligne spécifique dans une table spécifique.

Répondre

5

Vous pouvez transmettre un ensemble de données dans l'instruction Update d'un DataAdapter, , qui mettra à jour toutes les tables de l'ensemble de données. MISE À JOUR: Non, ce n'est pas le cas. DataAdapters met toujours à jour une seule table. La surcharge à Update() qui prend un DataSet comme paramètre, à partir du MSDN documentation, "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 ". " Désolé pour la confusion. Le reste de la réponse est toujours valide, cependant.

Si vous voulez assurer que toutes les mises à jour réussissent ou échouent comme une unité atomique, utilisez l'objet SqlTransaction:

DataSet ds = new DataSet(); 
// do something with the dataset 

SqlDataAdapter dataAdapter = new SqlDataAdapter(); 
SqlConnection cn = new SqlConnection(connString); 
cn.Open(); 

SqlTransaction trans = cn.BeginTransaction(); 

SqlDataAdapter dataAdapter = new SqlDataAdapter(); 

// set the InsertCommand, UpdateCommand, and DeleteCommand for the data adapter 

dataAdapter.InsertCommand.Transaction = trans; 
dataAdapter.UpdateCommand.Transaction = trans; 
dataAdapter.DeleteCommand.Transaction = trans; 

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

cn.Close(); 
+0

Comment peut-on dataAdapter savoir comment mettre à jour plusieurs tables stockées dans un DataSet? J'ai utilisé plusieurs DataAdapters car ils ont chacun sélectionné des tables différentes dans la base de données, puis utilisé CommandBuilder sur chaque DataAdapter pour générer la commande Update/Insert automatiquement. – gamzu07

+0

En réponse à votre question, j'ai commencé à signaler que la [documentation MSDN] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.update.aspx) pour 'SqlDataAdapter .Update() 'a une surcharge qui accepte un DataSet. Et en effet, c'est le cas. Mais ensuite j'ai vu votre point de vue, et creusé un peu plus loin. Vous avez raison, DataAdapters ne met à jour qu'une seule table. La surcharge qui prend un DataSet recherche une table dans le DataSet appelée "Table". Mon erreur. Je vais mettre à jour ma réponse en conséquence. –

+0

J'ai également trouvé que les choses doivent être faites dans cet ordre: dA = new SqlDataAdapter ("SELECT * FROM Table", cn); dA.SelectCommand.Transaction = tran; commandBuilder = new SqlCommandBuilder (dA); dA.InsertCommand = commandBuilder.GetInsertCommand(); dA.UpdateCommand = commandBuilder.GetUpdateCommand(); dA.DeleteCommand = commandBuilder.GetDeleteCommand(); dA.InsertCommand.Transaction = tran; dA.UpdateCommand.Transaction = tran; dA.DeleteCommand.Transaction = tran; – gamzu07

Questions connexes