Announcement

Collapse
No announcement yet.

Indixrückgabe bei INSERT

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

  • Indixrückgabe bei INSERT

    Hallo zusammen,
    ich hab grad angefangen meine erste Datenbank aufzubauen. Jetzt stehe ich vor nem kleinen Problem.
    Ich habe eine Tabelle in meiner Datenbank erstellt:

    Code:
    SqlCommand create_configuration;
    create_configuration = new SqlCommand("CREATE TABLE configuration (" +
                                 "ID SMALLINT IDENTITY(1,1) NOT NULL," +
                                 "name TEXT NOT NULL, " +
                                 "model TEXT, " +
                                 "min_elevation SMALLINT, " +
                                 "min_sat_number SMALLINT, " +
                                 "max_sat_number SMALLINT, " + 
                                 "min_SNR SMALLINT, " +
                                 "receiver_type SMALLINT, " +
                                 "DGPS BIT, " +
                                 "PRIMARY KEY(ID) " +
                                 ")", SQL);
    Die Spalte "ID" erzeugt mir jetzt jedes mal eine neue ID, die ich dann im nächsten Sritt gerne als "Foreign key" in eine andere Tabelle eintragen will.

    Gibt es eine Möglichkeit dass ich die ID direkt beim "INSERT"-Befehl zurück geben kann? Oder muss ich dann im nächsten Schritt meine Tabelle auf die eingefügten Werte durchsuchen um den Index raus zu bekommen?

    Wie wird sowas normalerweise gemacht??

    Ich weiß nicht obs an dieser Stelle Wichtig ist
    Ich programmiere mit C#
    und als Server verwende ich MS SQL Server 2005

    lg Uwe

  • #2
    Hallo Uwe,

    welche IDE und Zugriffskomponte Du nutzt, ist fast nebensächlich; man sendet ein SQL Statement (Command) ab und erhält ein Ergebnis (DataSet).

    Es gibt ein paar Möglichkeiten, den Wert des Identity von letzten Insert zu erhalten. Ab Sql Server 2005 ist es das beste, die Output-Klausel zu verwenden; ist auch rehct einfach.
    Beispiel:
    [highlight=Sql]CREATE TABLE #Test
    (Id int Identity(22, 1),
    Feld1 char(1))
    GO
    INSERT INTO #Test
    OUTPUT inserted.Id AS IdInserted
    VALUES ('A')
    GO
    DROP TABLE #Test[/highlight]
    Ergebnis:[highlight=code]IdInserted
    -----------
    22[/highlight]
    Das kannst Du zum Test ruhig aus C# gegen irgendeine SQL Connection ausführen, es legt bloss eine temporäre Tabelle an, Inserted, gibt das Identity zurück und entfernt die temps wieder.

    In C# muss Du mit Ado.Net nur .ExecuteReader ausführen statt .ExecuteNoQuery (oder wie es exakt ist, das weiss ich gerade nicht "auswendig ).
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo Olaf Helper,
      vielen Dank für die schnelle Antwort. So eine schöne Lösung hab ich gesucht :-).

      Code:
      cmdString = "INSERT INTO timestamp" +
                  "(timestamp, configuration_ref) " +
                  "OUTPUT inserted.ID " +
                  "VALUES " +
                  "('" + DateTimeTemp + "', " + current_configuration_index + ") ";
      
      cmd = new SqlCommand(cmdString, SQL);
      current_timestamp_index = Convert.ToDouble(cmd.ExecuteScalar());
      so siehts jetzt in C# aus.

      Comment

      Working...
      X