Announcement

Collapse
No announcement yet.

ID des zuletzt eingefügten Datensatzes ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ID des zuletzt eingefügten Datensatzes ermitteln

    Hallo zusammen

    Ich habe ein Problem (natürlich) und hoffe, dass ich hier kompetente Hilfe finde.
    Und zwar geht es um folgendes:

    Ich setze ASP.NET mit Oracle als DB-Backend ein.
    Für einen Algorithmus benötige ich nun die Möglichkeit, die ID eines gerade geschriebenen Datensatzes zu ermitteln.
    Klingt relativ einfach, aber eine saubere Lösung habe ich bisher nicht gefunden.
    Die ID wird mit einer Sequenz erstellt.
    Leider ist es ja nicht möglich, einfach <SEQUENZ>.CURVAL zu verwenden, weil in der Zwischenzeit kann ja bereits wieder ein Datensatz geschrieben werden.
    Optimal wäre sowas in der Art:

    ID = <insert auf oracle> returns <id des gerade geschriebenen Datensatzes>

    so könnte ich problemlos die Variable "ID" weiterverwenden.

    Ich habe gesehen, dass ähnliche Lösungen für MSSQL existieren.
    Nun hoffe ich, es gibt dazu auch ein brauchbares Oracle-Äquivalent.

    Vielen Dank und liebe Grüsse
    Andy

  • #2
    Ich bin zwar kein Oracle Experte, aber ohne Angabe auf Richtigkeit löse das Problem doch einfach wie folgt...

    Schreibe Dir einen Methode wo Deinen Datensatz einfügen soll und als Parameter ein OleDbCommand Objekt übergeben bekommt und Deine gewünschte ID zurückgibt:

    Code:
    public static string insertRecord(OleDbCommand oleDbCommand) 
    {
      string id = "";
      try 
      {
        oleDbCommand.Connection = verbindungZurDbAufbauen();
    
        // Deine ID zurückgeben
        id = oleDbCommand.Parameter["@sequenz"].Value;
    
        oleDbCommand.ExecuteNonQuery();
        
      }
      catch (OleDbException ex)
      {
        // ....
      }
      finally 
      {
       oleDbCommand.Connection.Close();
      }
    
      return id;
    
    }

    Comment


    • #3
      Glaube nicht, dass dies die Lösung ist.
      Nach deinem Statement (zumindest verstehe ich das so), liest du einfach die aktuelle Value der Sequenz aus.
      Ich brauche aber die ID des Datensatzes, der gerade in der entsprechenden ASP-Session erstellt wurde.

      Im übrigen:
      Ich benutze die Klasse "SqlDataSource". Wäre toll, wenn die Lösung gerade so geschrieben ist (ich bin Anfänger und habe z.T. noch etwas Mühe mit Anpassungen)...

      Gruss
      Andy

      Comment


      • #4
        Nach viel Google und rumprobieren habe ich die Lösung. Für alle, die auch mal in die Situation kommen:

        Gelöst habe ich es mit einer Funktion:

        Code:
           Public Function SaveDbAndReturnId(ByVal SqlCommand As String)
        
                Dim Database As New Data.OracleClient.OracleConnection
                Database.ConnectionString = "Data Source=<Name>;Persist Security Info=True;User ID=<Name>;Password=<Name>;Unicode=True"
        
                Dim Command As New Data.OracleClient.OracleCommand
                Command.CommandText = SqlCommand
                Command.Connection = Database
        
                Dim NewId As New Data.OracleClient.OracleParameter
                NewId.ParameterName = "ID"
                NewId.OracleType = Data.OracleClient.OracleType.Number
                NewId.Direction = Data.ParameterDirection.Output
        
                Command.Parameters.Add(NewId)
                Command.Connection.Open()
                Command.ExecuteNonQuery()
        
                Dim GetId As Integer = Command.Parameters.Item(0).Value
        
                Command.Connection.Close()
        
                Return GetId
        
            End Function
        Welche So aufgerufen werden kann:

        Code:
        Dim SqlCommand As String
        
                SqlCommand = "INSERT INTO BENUTZERINFO " & _
                    "(BENUTZERINFO_ID, TITEL) " & _
                    "VALUES " & _
                    "(BENUTZERINFO_ID.NEXTVAL, 'Help') " & _
                    "RETURNING BENUTZERINFO_ID INTO :ID"
                LabelId.Text = ServiceCenter.SaveDbAndReturnId(SqlCommand)
        Grüsse, Andy

        Comment

        Working...
        X