2009-06-02 8 views
0

J'essaie d'obtenir les données qui ont été entrées avec succès dans la base de données via la transaction ADO.NET. Une fois que vous avez appelé trans.Commit(), il ne semble pas possible de récupérer les données qui ont été validées car toutes les colonnes d'identité créées lors de la transaction sont "virtuelles" car il s'agit d'un ensemble de données hors ligne jusqu'à ce que commitComment accéder aux données qui ont été insérées à l'aide d'une transaction ADO.NET?

un grand merci

[EDIT]

Ahh, le problème est, je ne peux pas faire Resélectionner que je n'ai rien unique de choisir sur autre que l'identité de les données insérées dans le cadre de la transaction.

Je ne peux pas le dernier élément entré comme c'est un système multi-utilisateur

Exemple de code d'un livre, pas le code en question, mais assez bon pour illustrer ce que je dois:

using System.Data; 
using System.Data.SqlClient; 

namespace DataAdapterTransaction 
{ 
    class Program 
    { 
     private static string sqlConnectString = "Data Source=(local);" + 
      "Integrated security=SSPI;Initial Catalog=AdoDotNet35Cookbook;"; 

     private static string sqlSelect = "SELECT * FROM DataAdapterTransaction"; 

     static void Main(string[] args) 
     { 
      object[,] o1 = {{ "1", "field 1.1", "field 2.1" }, 
          { "2", "field 1.2", "field 2.2" }}; 
      InsertRecords(o1); 

      object[,] o2 = {{ "3", "field 1.3", "field 2.3" }, 
          { null, "field 1.4", "field 2.4" }}; 
      InsertRecords(o2); 

      // Retrieve and output the contents of the table 
      SqlDataAdapter daRead = new SqlDataAdapter(sqlSelect, sqlConnectString); 
      DataTable dtRead = new DataTable(); 
      daRead.Fill(dtRead); 
      Console.WriteLine("---TABLE DataAdapterTransaction---"); 
      foreach (DataRow row in dtRead.Rows) 
       Console.WriteLine("Id = {0}\tField1 = {1}\tField2 = {2}", 
        row["Id"], row["Field1"], row["Field2"]); 

      Console.WriteLine("\nPress any key to continue."); 
      Console.ReadKey(); 
     } 

     static void InsertRecords(object[,] o) 
     { 
      DataTable dt = new DataTable(); 
      SqlTransaction tran; 

      SqlConnection connection = new SqlConnection(sqlConnectString); 

      // Create a DataAdapter 
      SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connection); 
      // Stop updating when an error is encountered for roll back. 
      da.ContinueUpdateOnError = false; 
      // Create CommandBuilder and generate updating logic. 
      SqlCommandBuilder cb = new SqlCommandBuilder(da); 
      // Create and fill a DataTable with schema and data 
      da.Fill(dt); 
      // Open the connection 
      connection.Open(); 
      // Begin a new transaction and assign it to the DataAdapter 
      tran = connection.BeginTransaction(); 
      da.SelectCommand.Transaction = tran; 

      // Add two rows that will succeed update 
      for (int i = 0; i <= o.GetUpperBound(0); i++) 
      { 
       dt.Rows.Add(new object[] { o[i, 0], o[i, 1], o[i, 2] }); 
       Console.WriteLine(
        "=> Row with [Id = {0}] added to DataTable.", o[i, 0]); 
      } 

      Console.WriteLine("=> Updating data source using DataAdapter."); 
      try 
      { 
       da.Update(dt); 
       tran.Commit(); 

       Console.WriteLine("\nTRANSACTION COMMIT.\n"); 
      } 
      catch (Exception ex) 
      { 
       tran.Rollback(); 
       Console.WriteLine("\nTRANSACTION ROLLBACK.\n{0}\n", ex.Message); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
    } 
} 

Ok, donc ce que je veux est juste après la validation de la transaction, je veux obtenir l'identité (portée) de la dernière ligne insérée.

Mon application a réussi à mettre à jour trois DataAdapters dans le cadre de la transaction, mais j'ai recherche dificulty les données validées finales. Je peux faire un choix de la table et le voir là-bas, mais ce n'est vraiment pas assez bon pour le code de production.

SC

+0

pouvez-vous poster votre code? –

Répondre

1

Vous aurez juste besoin de sélectionner de nouveau les données.

+0

exactement, si vous avez encore le DataSet, il suffit de l'utiliser, sinon le faire à nouveau ... – balexandre

0

Les livres en ligne dit que vous devez appeler un remplissage à nouveau pour faire la mise à jour de votre Dataset:

http://msdn.microsoft.com/en-us/library/33y2221y(VS.71).aspx

Je mets généralement mes commandes Insertion et mise à jour afin qu'ils reviennent en arrière un DataRow valable pour mon DataTable et contrôlez la mise à jour des lignes dans l'application de cette façon.

0

droit, donc je dois faire:

// update datatable 
da.Update(dt); 
// commit updates 
tran.Commit(); 
// get the updated datatable 
da.Fill(dt); 

Je suppose tous les colums d'identité seront mises à jour.

Je vais donner un aller

SC

0

Je comprends que vous utilisez des colonnes d'identité, mais est-il une touche naturelle dans les données que vous pouvez utiliser pour sélectionner de nouveau?

(qui alors pose la question de « pourquoi utiliser des identités », mais qui est un tout autre sujet ...)

0

Malheureusement non, je ne peux pas sélectionner à nouveau l'aide d'une clé naturelle ... Je suis coincé avec des identités. .. après 8 heures de coups de tête, j'ai envisagé d'ajouter un champ guid afin que je puisse le faire fonctionner, mais j'ai décidé que c'était contre mes principes d'abandonner!

SC

0

This MSDN article décrit comment récupérer des valeurs d'identité lors de l'appel de la méthode de mise à jour d'un DataAdapter.

Questions connexes