2009-06-02 3 views
0

Ich versuche, die Daten, die erfolgreich über ADO.NET-Transaktion in die Datenbank eingegeben wurden, zu erhalten.Wie greifen Sie auf Daten zu, die mithilfe einer ADO.NET-Transaktion eingefügt wurden?

Sobald Sie trans.Commit() aufgerufen haben, scheint es keine Möglichkeit zu geben, die zugesicherten Daten zurückzubekommen, da alle Identitätsspalten, die während der Transaktion erstellt wurden, 'virtual' sind, da es ein offline-Datensatz bis

Vielen dank verpflichten

[EDIT]

Ahh, das Problem ist, kann ich eine Neuauswahl nicht tun, wie ich etwas auf andere zu wählen haben nicht einzigartig, als die Identität die Daten, die als Teil der Transaktion eingefügt werden.

Ich kann das zuletzt eingegebene Element erhalten, da dies einem System Multi-User ist

Codebeispiel aus einem Buch, nicht den Code in Frage, aber gut genug, um zu veranschaulichen, was ich brauche:

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(); 
      } 
     } 
    } 
} 

Okay, nach dem Transaktions-Commit möchte ich nun die (Scope) Identität der zuletzt eingefügten Zeile ermitteln.

Meine Anwendung hat erfolgreich drei Datenadapter als Teil der Transaktion aktualisiert, aber ich habe Schwierigkeiten, die endgültigen festgeschriebenen Daten zu betrachten. Ich kann eine Auswahl der Tabelle treffen und sie dort sehen, aber das ist wirklich nicht gut genug für Produktionscode.

SC

+0

können Sie Ihren Code posten? –

Antwort

1

Sie müssen nur die Daten erneut auszuwählen.

+0

genau, wenn Sie noch das DataSet haben, verwenden Sie es einfach, wenn Sie es nicht noch einmal bekommen ... – balexandre

0

Die Bücher Online sagt, dass man wieder einen Fill rufen sollten das Update Ihren Datensatz zu bringen:

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

ich meine Insert und Update im Allgemeinen setzen Befehle, so dass sie sie zurückkommen meine eine gültige DataRow zurück für DataTable und steuern Sie die Aktualisierung der Zeilen in der Anwendung auf diese Weise.

0

Rechts so soll ich tun:

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

Ich nehme an, die alle Identität colums aktualisiert.

Ich werde es ein

SC

0

ich Ihnen verstehe, geht geben sind Identitätsspalten verwenden, aber gibt es einen natürlichen Schlüssel in den Daten, die Sie erneut auswählen können?

(das dann stellt sich die Frage: ‚Warum verwenden Identitäten‘, aber das ist eine ganz andere Thema ...)

0

Leider nein, ich kann nicht wählen Sie erneut einen natürlichen Schlüssel ... Ich bin mit Identitäten fest. .. nach 8 Stunden Kopfknacken überlegte ich, ob ich ein Guid-Feld hinzufügen könnte, damit ich es zur Arbeit bringen konnte, entschied aber, dass es gegen meine Prinzipien ist, aufzugeben!

SC

0

This MSDN article beschreibt, wie Identitätswerte zurück zu erhalten, wenn die Update-Methode eines Dataadapter aufgerufen wird.