.
Anmeldung | Registrieren | Hilfe
in Suchen

Gerade neu erstellten Datensatz ermitteln?

Letzter Beitrag 14. Jul 2010 9:34 von eloradana. 14 Antworten.
Seite 1 von 1 (15 Treffer)
Beiträge sortieren: Zurück Weiter
  • 12. Jul 2010 14:59

    • eloradana
    • Top 75 Mitwirkender
      Männlich
    • Registriert am 01. Jul 2010
    • Beiträge 24
    • Punkte 465

    Gerade neu erstellten Datensatz ermitteln?

    Hello,

    ich habe das schon einmal gesehen, man kann irgendwie den gerade erstellten Datensatz ermitteln oder?!
    Ich möchte nach dem INSERT-Statement sofort die ID (AutoWert) ermitteln, damit ich diesen zurückgeben kann.

    Vielen Dank
    lg
    ED
    • IP-Adresse ist Registriert
  • 12. Jul 2010 15:14 Antwort zu

    • Timo Rehl
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05. Mai 2009
    • Wald-Michelbach
    • Beiträge 591
    • Punkte 10.200

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    das hängt ganz stark von der Datenbank a, die Du verwendest, welche ist bei Dir in Verwendung?

    Grüße
    Timo
    - theres no place like 127.0.0.1 -
    • IP-Adresse ist Registriert
  • 12. Jul 2010 15:18 Antwort zu

    • eloradana
    • Top 75 Mitwirkender
      Männlich
    • Registriert am 01. Jul 2010
    • Beiträge 24
    • Punkte 465

    Gerade neu erstellten Datensatz ermitteln?

    Hey,

    ich verwende Access.

    OleDbConnection con = new OleDbConnection();
    OleDbCommand cmd = new OleDbCommand();
    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("~") + "/App_Data/lupus.mdb";
    cmd.Connection = con;
    
    try
    {
      con.Open();
      cmd.CommandText="INSERT INTO Category " +
                      "(ImageFile,ParentCategoryID,UrlName,SortOrder,DiscountGroupID,IsEnabled,Other1,Other2,Other3,Other4,Other5,CategoryListLayoutPath,ProductListLayoutPath) VALUES " +
                      "('" + ImageFile_s + "'," + ParentCategoryID_i + ",'" + UrlName_s + "'," + SortOrder_i + "," + DiscountGroupID_i + "," + IsEnabled_i + ",'" + Other1_s + "', '" + Other2_s + "', '" + Other3_s + "', '" + Other4_s + "', '" + Other5_s + "', '" + CategoryListLayoutPath_s + "', '" + ProductListLayoutPath_s + "') ";
      anzahl = cmd.ExecuteNonQuery();
      if (anzahl > 0)
      { 
         // Neuer Datensatz geschrieben ID ermitteln und zurückschreiben.
        
      }
      }
      catch (Exception ex)
      { 
        // ERROR
    }


    Vielen Dank

    lg
    ED
    • IP-Adresse ist Registriert
  • 12. Jul 2010 15:50 Antwort zu

    • Markus
    • Top 25 Mitwirkender
    • Registriert am 23. Jan 2008
    • Göttingen
    • Beiträge 119
    • Punkte 2.020

    Gerade neu erstellten Datensatz ermitteln?

    Hallo,

    die Id kannst du per SQL abfragen. Zum Beispiel so:

      SELECT top(1) Id  
      FROM Tabellenname
      ORDER BY Id desc

    Markus
    Abgelegt unter:
    • IP-Adresse ist Registriert
  • 12. Jul 2010 15:59 Antwort zu

    • Timo Rehl
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05. Mai 2009
    • Wald-Michelbach
    • Beiträge 591
    • Punkte 10.200

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    bei Access kann man leider nicht komfortabel die vergebene ID abfragen oder zurückbekommen. Entgegen Markus Löung würde ich empfehlen folgende Abfrage zu verwenden:
    SELECT MAX(ID) FROM myTable;


    Gegebenenfalls solltest Du dann auch mit Transaktionen arbeiten, dass Parallelzugriffe verhindert werden.

    Grüße
    Timo
    - theres no place like 127.0.0.1 -
    • IP-Adresse ist Registriert
  • 12. Jul 2010 19:42 Antwort zu

    • eloradana
    • Top 75 Mitwirkender
      Männlich
    • Registriert am 01. Jul 2010
    • Beiträge 24
    • Punkte 465

    Gerade neu erstellten Datensatz ermitteln?

    Servus,

    vielen Dank, sorry bin Anfänger, wovon sprichst Du bitte? Transaktionen? Ich habe was von SELECT @@IDENTITY bzw.
    ScopeIdentity gelesen, ist das nichts für Access?

    Vielen Dank

    lg
    ED
    • IP-Adresse ist Registriert
  • 12. Jul 2010 21:37 Antwort zu

    • Timo Rehl
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05. Mai 2009
    • Wald-Michelbach
    • Beiträge 591
    • Punkte 10.200

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    eloradana:
    Ich habe was von SELECT @@IDENTITY bzw.
    ScopeIdentity gelesen, ist das nichts für Access?

    Nein, das eine ist die gerade erstellte ID in MS-SQL Servern, und das "ScopeIdentity" ist mir nicht geläufig.

    Für Access kannst Du nur die höchste in der Tabelle befindliche ID abfragen, deshalb das MAX(ID), während "ID" die Autoincrement Spaltenbezeichnung der entspr. Tabelle ist.

    Transaktionen? Transaktionen sind für Datenbanken mehrere Operationen, die "geklammert" werden. Entweder werden alle Operationen oder keine ausgeführt. Das Prinzip funktioniert normalerweise so, dass man zu Anfangs eine Transaktion aufmacht, dann die einzelnen Operationen durchführt, dann zum Schluß ein "Commit". Sollte während dem BeginTransaction und dem Commit jemand dazwischen gefunkt haben, oder ein Fehler aufgetreten sein, so kann man ein Rollback durchführen, und alles ist so, als wäre nix geschehen (aus Sicht der Datenbank).

    Für Ole-DB Kommandos gibt es die entsprechenden Umsetzungen:
    Ole-DB BeginTransaction
    Ole-DB Commit
    Ole-DB Rollback

    Ich habe Transaktionen deshalb angesprochen, denn es könnte folgendes Szenario auftreten:
    Voraussetzungen:
    - 2 Programme, die parallel gleichzeitig laufen
    - 1 Datenbank

    Ablauf
    - Zugriff Programm A auf DB Tabelle User
    - Programm A erstellt neuen User in DB (ID 4 wird generiert)
    - Zugriff Programm B auf DB Tabelle User
    - Programm B erstellt neuen User in DB (ID 5 wird generiert)
    - Programm A fragt nun die letzte ID ab (bekommt ID 5)
    - Programm B fragt nun die letzte ID ab (bekommt ID 5)

    => Du siehst das Problem?

    Deshalb Transaktionen:
    Ablauf
    - Zugriff Programm A auf DB Tabelle User (mit Transaktion T1)
    - Programm A erstellt neuen User in DB (ID 4 wird generiert mit T1)
    - Zugriff Programm B auf DB Tabelle User (mit Transaktion T2)
      -> Fehler, Tabelle User von T1 geblockt
    - Programm A fragt nun die letzte ID ab (bekommt ID 4)
    - Programm A beendet T1 mit Commit
    - Programm B wiederholt den Vorgang, dann gleicher Ablauf wie Programm A...

    Grüße
    Timo
    - theres no place like 127.0.0.1 -
    • IP-Adresse ist Registriert
  • 13. Jul 2010 8:22 Antwort zu

    • eloradana
    • Top 75 Mitwirkender
      Männlich
    • Registriert am 01. Jul 2010
    • Beiträge 24
    • Punkte 465

    Gerade neu erstellten Datensatz ermitteln?

    Servus Timo,

    ich danke Dir für diese tolle und ausführliche Antwort. Das hilft mir wirklich sehr. Das ist im Grunde das was ich schon länger suche.
    Mir macht das mit dem SELECT MAX(id) allerdings ein wenig Sorgen. Wie sicher ist, dass ich tatsächlich meinen gerade geschriebenen Datensatz erhalte?

    Vielen Dank
    lg
    ED
    • IP-Adresse ist Registriert
  • 13. Jul 2010 8:31 Antwort zu

    • Bernd
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10. Jan 2009
    • Weißbach
    • Beiträge 108
    • Punkte 1.440

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    bin gerade auf Deinen Thread hier gestoßen. Ich hatte das gleiche Problem, was eigentlich ganz einfach zu lösen ist!

    Wie oben schon geschrieben wurde, fragst Du den letzten Datensatz mit:

    SELECT MAX(ID) FROM myTable

    ab. Nun, um sicher zu sein, dass Du auch Deinen Datensatz zurück bekommst, benötigst Du noch ein weiteres Argument. Hast Du z.B. eine Kundennummer, dann sieht der SQL-String so aus:

    SELECT MAX(ID) FROM myTable WHERE [Kundennummer] = 'Deine Kundennummer'

    Hiermit bekommst Du dann sicher den letzten Datensatz für Deinen Kunden oder was auch immer zurück. Ganz egal, ob in einer Mehrbenutzerumgebung jemand im gleichen Moment, bzw. eine Millisekunde später, einen Datensatz gespeichert hat.

    Gruß vom Bernd

    ..bin blutiger Anfänger, will mich aber bessern, nicht zuletzt mit Eurer Hilfe.. ;o)
    Sprache: VB.NET 2008
    Nachtrag: Das Programmieren macht mir mehr und mehr Spaß! Auch dank Euch..
    Nachtrag 2: Ich bin froh, Teil dieser Community sein zu dürfen. Ihr seid klasse..!!!!
    • IP-Adresse ist Registriert
  • 13. Jul 2010 8:35 Antwort zu

    • Timo Rehl
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05. Mai 2009
    • Wald-Michelbach
    • Beiträge 591
    • Punkte 10.200

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    eloradana:
    Wie sicher ist, dass ich tatsächlich meinen gerade geschriebenen Datensatz erhalte?

    Das kannst Du so wie Bernd es beschrieben hat lösen, auch wenn das nicht immer eine 100% Lösung ist, oder wie gesagt: Du verwendest Transaktionen.

    Die Datenbank weiß dann, dass an der Tabelle xy gearbeitet wird und wartet auf das Commit. Sollte zwischenzeitlich jemand anderes an der Tabelle arbeiten wollen (indem er versucht auch eine Transaktion zu öffnen), dann erhält derjenige einen Fehler.

    Also innerhalb von Transaktionen sorgt die Datenbank dafür, dass Du die richtige ID dann zurück bekommst.

    Grüße
    Timo


    - theres no place like 127.0.0.1 -
    • IP-Adresse ist Registriert
  • 13. Jul 2010 13:48 Antwort zu

    • Martin Hey
    • Top 50 Mitwirkender
      Männlich
    • Registriert am 08. Mrz 2010
    • Dresden
    • Beiträge 58
    • Punkte 950

    Gerade neu erstellten Datensatz ermitteln?

    Hallo ED,

    seit Jet 4.0 (was du ja verwendest) wird @@Identity unterstützt. Daher sollte das Ermitteln des zuletzt angefügten Identitätswertes damit relativ einfach funktionieren.

    using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\MyDB.mdb"))
    {
        conn.Open();
    
        using (OleDbCommand cmd = new OleDbCommand("INSERT INTO Tabelle1(Description) VALUES(@descricption)",conn))
        {
            cmd.Parameters.AddWithValue("@descricption", "Test");
            cmd.ExecuteNonQuery();
        }
    
        object lastId;
        using (OleDbCommand cmd = new OleDbCommand("SELECT @@IDENTITY",conn))
        {
            lastId = cmd.ExecuteScalar();
        }
        Console.WriteLine(lastId.ToString());
    }


    Grüße

    Martin
    Sometimes when I'm alone, I google myself.

    Blog: http://www.uniquesoftware.de/blog/de
    Website: http://www.uniquesoftware.de
    • IP-Adresse ist Registriert
  • 13. Jul 2010 15:21 Antwort zu

    • Timo Rehl
    • Top 10 Mitwirkender
      Männlich
    • Registriert am 05. Mai 2009
    • Wald-Michelbach
    • Beiträge 591
    • Punkte 10.200

    Gerade neu erstellten Datensatz ermitteln?

    Hallo Martin,

    Martin Hey:
    seit Jet 4.0 (was du ja verwendest) wird @@Identity unterstützt.

    Hey, das war mir neu, und somit ha ich wieder was gelernt. Danke für die Info.

    Kann MS-Access das auch für verschiedene Connections auseinanderhalten, ist die DB-Engine so schlau? Dann könnte man sich in diesem Falle auch die Transaktionen sparen, das wäre ja mal ein Fortschritt für Access.

    Grüße
    Timo
    - theres no place like 127.0.0.1 -
    • IP-Adresse ist Registriert
  • 13. Jul 2010 15:31 Antwort zu

    • Martin Hey
    • Top 50 Mitwirkender
      Männlich
    • Registriert am 08. Mrz 2010
    • Dresden
    • Beiträge 58
    • Punkte 950

    Gerade neu erstellten Datensatz ermitteln?

    Hi Timo,
    Timo Rehl:

    Kann MS-Access das auch für verschiedene Connections auseinanderhalten, ist die DB-Engine so schlau? Dann könnte man sich in diesem Falle auch die Transaktionen sparen, das wäre ja mal ein Fortschritt für Access.

    da bin ich mir nicht so sicher. Das käme auf einen Versuch an.

    Grüße
    Martin
    Sometimes when I'm alone, I google myself.

    Blog: http://www.uniquesoftware.de/blog/de
    Website: http://www.uniquesoftware.de
    • IP-Adresse ist Registriert
  • 14. Jul 2010 9:30 Antwort zu

    • Bernd
    • Top 25 Mitwirkender
      Männlich
    • Registriert am 10. Jan 2009
    • Weißbach
    • Beiträge 108
    • Punkte 1.440

    Gerade neu erstellten Datensatz ermitteln?

    Hey Martin,

    mir, als Anfänger, war das natürlich auch neu. Danke für die Lehrstunde! Yes

    Mir ist allerdings noch nicht ganz klar, was " eloradana" wirklich benötigt. Sicher schreibt er, dass er die ID zurück haben will, allerdings benötigt er, meines Erachtens nach, den ganzen Datensatz um einen Reload seiner Felder zu machen. Nur damit sieht er dann, dass alles richtig gespeichert wurde.

    Wenn er also den ganzen Datensatz nach dem Speichern wieder einliest und seine Felder erneut mit den Daten füllt, hat er gleich die Sicherheit, bzw. kann überprüfen, ob alles richtig gespeichert wurde.

    So habe ich das wenigstens bei mir gelöst. Gibt es bessere Lösungen?

    Eins noch:
    Wie Timo bereits geschrieben hat, ist meine Lösung keine 100%tige! Stimmt! Wenn mehrere Mitarbeiter den gleichen Kunden (wenn es um Kunden geht) bearbeiten, dann könnte der falsche DS zurückkommen. Ich habe inzwischen 103500 Datensätze in der DB, bei 72 Usern und es ist bislang nie vorgekommen.. ;o)

    Grüße aus dem Backofen..
    Bernd

    ..bin blutiger Anfänger, will mich aber bessern, nicht zuletzt mit Eurer Hilfe.. ;o)
    Sprache: VB.NET 2008
    Nachtrag: Das Programmieren macht mir mehr und mehr Spaß! Auch dank Euch..
    Nachtrag 2: Ich bin froh, Teil dieser Community sein zu dürfen. Ihr seid klasse..!!!!
    • IP-Adresse ist Registriert
  • 14. Jul 2010 9:34 Antwort zu

    • eloradana
    • Top 75 Mitwirkender
      Männlich
    • Registriert am 01. Jul 2010
    • Beiträge 24
    • Punkte 465

    Gerade neu erstellten Datensatz ermitteln?

    Servus Bernd,

    nein ich benötige lediglich die ID des Datensatzes, mehr nicht. Diese wird dann für eine andere Tabelle verwendet, wo dann wieder
    andere Daten hineinkommen.

    Also mit  Transaction funktioniert das super. Und die Chane, dass bei mir mehrere Leute zugleich diese Funktion ausführen ist quasi NULL.

    Vielen dank
    lg
    ED
    • IP-Adresse ist Registriert
Seite 1 von 1 (15 Treffer)

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum