Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

ID beim Anlegen vergeben

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von mille81, 31 Oktober 2014.

  1. mille81

    mille81 Benutzer

    Hallo zusammen,

    ich habe ein Access Frontend mit MS SQL Backend. habe folgendes Problem:
    Wenn ich einen neuen Datensatz anlege erzeugt er im Feld B_ID (welches der Primary Key ist) erst nach Verlassen des Datensatzes eine neue ID und nicht direkt beim Anlegen.
    (Timestamp Feld ist auch vorhanden. Access kann aber scheinbar nicht drauf zugreifen, bzw. das Feld wird auch erst nach verlassen des ds gefüllt.)

    Ich habe mehrere Funktionen die die ID direkt beim Anlegen benötigen.
    Kann man das irgendwie einstellen?
     
    Zuletzt bearbeitet: 31 Oktober 2014
  2. ukulele

    ukulele Datenbank-Guru

    Also unter MSSQL würde man einen UNIQUEIDENTIFIER mit newid() anlegen. Von welchem Datentyp deine ID sein soll hast du nicht geschrieben und das ist auch eher eine Sache von Access. Vieleicht läßt sich dort irgendwo newid() als Standardwert einstellen? Ich kann mir auch nicht vorstellen, das Access die Daten ohne ID in die Datenbank schreibt, vermutlich ist dein ganzer Datensatz noch nicht angelegt.
     
  3. mille81

    mille81 Benutzer

    Ich möchte die ID automatisch vergeben.
    Datentyp int
    Primayr Key
    Identitätsspezifikation: Ja
    (Ist Identity) Ja
    ID-Ausgangswert 1
    ID_Inkrement 1

    NIQUEIDENTIFIER kennt access als datentyp nicht....
     
  4. mille81

    mille81 Benutzer

    Auch den UNIQUEIDENTIFIER legt er bei mir/in Access scheinbar erst nach verlassen des DS an...

    Ich migriere gerade eine vorhandene DB von Access zu MS SQL
    Das Problem ist, dass ich den Datentyp int (oder in Access ist es Long) schon in allen Tabellen als ID gesetzt habe. D.h. es bestehen schon Einträge die untereinander verknüpft sind. Ich kann etzt also nicht mal eben die ID´s ändern...
     
    Zuletzt bearbeitet: 31 Oktober 2014
  5. ukulele

    ukulele Datenbank-Guru

    Ließe sich schon ändern aber macht natürlich nur Sinn wenn dein Problem dann nicht mehr besteht. Leider habe ich mit Access nur wenig Erfahrung, nutze das nur als Export Format und importiere daraus. Teste am besten mal anhand einer Tabelle ob das Problem mit UID ebenfalls besteht, wenn nicht, helfe ich dir beim Umstellen das ist ja alles normales SQL :)
     
  6. mille81

    mille81 Benutzer

    Also ich lege meinen Datensatz über VBA neu an:
    dat.AddNew
    dat!ID_VA = Me!ID_VA
    etc.
    Ich kann aber solange ich den Erfassungsvorgang nicht beendet habe, nicht auf die UID zugreifen.
    In Access ist es so, wenn ich einen Wert in die Zeile schreibe erzeugt er SOFORT die ID und ich kann Sie nutzen.

    Was man machen könnte, ist die UID selber über eine Funktion erzeugen und dann in das UID Feld schreiben (dazu dann den Standardwert rausnehmen).
    Das zieht dann aber nach sich, dass ich in allen verknüpften Tabellen (und das sind nicht wenige) überall aus der int ID eine UID machen muss. Und das muss auch im Code gesetzt werden...
    Das ist ein Heidenaufwand...
     
  7. ukulele

    ukulele Datenbank-Guru

    Ich denke nicht das ein Wechsel von INT auf UID notwendig ist. Ich dachte es könnte die Sache mit der ID Erzeugung unter Access erleichtern.
     
  8. Hony%

    Hony% Datenbank-Guru

    Hi
    Der Datensatz wird in MS-SQL erst angelegt nachdem du ihn mit Access »abgeschickt« hast. Vorher weiß MS-SQL ja auch noch nichts von den neuen Daten. Client-Server-Systeme arbeiten anders als Desktop-Systeme.

    Das ist ganz grundsätzlich schlechtes Anwendungsdesign und lässt sich jetzt nur noch schwer ändern. Versuche Abhängigkeiten verschiedener Schichten in Zukunft zu vermeiden. Für gewöhnlich wird hier zum Beispiel mit einem MVC-Pattern gearbeitet.

    Theoretisch solltest du aber die ID nach dem Anlegen mit »SELECT @@IDENTITY AS 'Identity';« abfragen können.

    Daran wird sich meiner Ansicht nach auch nichts ändern lassen. Zumindest nicht wenn die ID von MS-SQL erzeugt werden soll.

    Gruß
    Hony
     
    Walter gefällt das.
  9. mille81

    mille81 Benutzer

    Ich hab es jetzt erstmal umgangen, indem ich die ID manuell erzeuge (letzte int ID abfragen +1)
    schaue mir deine Anmerkungen aber auch mal an.
     
  10. Hony%

    Hony% Datenbank-Guru

    Das ist nur als vorläufige Lösung geeignet. Wenn mit deiner Anwendung mehrere Datensätze gleichzeitig angelegt werden wird es zwangsläufig zu Fehlern wegen doppelten IDs kommen.
     
  11. mille81

    mille81 Benutzer

    Hm recht hast Du...

    kann ich mit der SELECT @@IDENTITY AS 'Identity'; auch meine int ID abfragen wenn ich dei Identitätsspezifikation: Ja gesetzt habe?
     
  12. Hony%

    Hony% Datenbank-Guru

    Das wirst du ausprobieren müssen. Ich arbeiten normalerweise nicht mit Access und auch kaum mit MS-SQL. Aber wenn ich das richtig verstanden habe ist die Identitätsspezifikation doch eine reine Access Angelegentheit und hat mit MS-SQL nichts zu tun. Demnach sollte die Abfrage bei von MS-SQL angelegten Auto-ID Feldern funktionieren.

    Genauere Infos wirst du allerdings auf der verlinkten Webseite finden.
     
  13. mille81

    mille81 Benutzer

    Ne ne die Identitätsspezifikation gebe ich in MS SQL an...
     
  14. Hony%

    Hony% Datenbank-Guru

    Stimmt. Ich denke @ukulele wird da Genaueres wissen. Wenn ich das richtig interpretiere ist das die MS-SQL Variante von autoincrement und sollte daher funktionieren.
     
  15. ukulele

    ukulele Datenbank-Guru

    Habe mich mit @@IDENTITY eigentlich auch noch nicht befasst da ich noch kein Front-End selbst programmiert habe. Sieht aber so aus als ob das ein paasender Lösungsweg für dich wäre.

    Das Problem mit dem max(ID) + 1 besteht ja eigentlich nur, weil deine IDs fortlaufend vergeben werden sollen. Bei UID könnte man so verfahren (erst UID erzeugen, dann Datensatz schreiben, dann weitere Datensätze mit der erzeugten ID als Fremdschlüssel schreiben). Die Warscheinlichkeit das deine UID in dieser Zeit von einem anderen Benutzer generiert wurde ist unvorstellbar gering...

    Aber wie gesagt, @@IDENTITY sieht nach einer idealen Lösung aus.
     
    Hony% gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden