Announcement

Collapse
No announcement yet.

Problem beim Einfügen von Datensätzen

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

  • Problem beim Einfügen von Datensätzen

    Hallo,

    Konfig.: Delphi 6, ADO, MS SQL 2000

    Im Datenmodell befindet sich eine Supertype-Entität A mit zwei abgeleiteten (jeweils in 1:1-Manier) Subtype-Entitäten (A1 und A2). Das Problem ist nun folgendes: Tabelle A beinhaltet gegenwärtig nur den Primärschlüssel (vom Datentyp int mit gesetzter identity-Eigenschaft).

    Versuche ich nun einfach einen neuen Datensatz in A anzulegen, um den neu generierten Primärschlüssel zu erhalten:

    A.Open;<br>
    A.Append;<br>
    Result := AID.Value;<br>
    A.Post;<br>

    so bekomme ich die Fehlermeldung, das mindestens eine Spalte mit Werten belegt sein muss.

    Ist das für den SQL-Server ein Problem bei einer Tabelle mit nur einer Autoinc-Spalte? Wenn ja, wie kann dieses Problem gelöst werden. Ich möchte eigentlich ungern ein Art Dummy-Feld einfügen.

    Stephan Schneider

  • #2
    Hallo,

    &gt;Ist das für den SQL-Server ein Problem bei einer Tabelle mit nur einer Autoinc-Spalte?

    Wenn auch nur eine Spalte der Tabelle mit NOT NULL gekennzeichnet wurde, muss der SQL Server ein Veto einlegen.

    Warum soll der Primärschlüsselwert für den neuen Datensatz vorab abgefordert werden? Es gibt hier ja gleich 3 Alternativen:

    1. Datensatz in Haupttabelle vollständig eintragen, Primärschlüsselwert danach für die anderen 1:1-Tabellen verwenden.

    2. ltBatchOptimistic: Sowohl Haupt- als auch 1:1-Tabellen verwenden eine eigene Nummerierung (ohne direkten Datenbankzugriff). Beim Update geht man im Programm in einer Schleife alle Datensätze der Haupttabelle durch, macht das INSERT über eine Stored Procedure (über TADOCommand etc.) und verwendet den zurückerhaltenen Primärschlüsselwert auch beim INSERT für die 1:1-Tabellen.

    3. ltBatchOptimistic: Sowohl Haupt- als auch 1:1-Tabellen verwenden eine eigene Nummerierung (ohne direkten Datenbankzugriff). Alle Datenmengen (Haupttabelle und 1:1-Tabellen) rufen am Ende die <b>UpdateBatch</b>-Methode des Recordsets auf, wobei auf der Datenbankseite ein <b>INSTEAD OF</b>-Trigger die eigenen ID-Werte (ltBatchOptimistic-Modus) durch den tatsächlichen Primärschlüsselwert ersetzt

    Comment


    • #3
      Hallo,

      &gt; Ist das für den SQL-Server ein Problem bei einer Tabelle mit nur einer Autoinc-Spalte?

      Angenommen, in der SQL Server 2000-Datenbank wird die folgende Datenbanktabelle verwendet:
      <pre>
      USE tempdb
      GO
      CREATE TABLE TestTbl (
      MasterID INTEGER NOT NULL IDENTITY PRIMARY KEY
      )
      GO
      </pre>
      Um dort einen neuen Datensatz einfügen zu können, wird die spezielle Syntax-Form für INSERT mit <b>DEFAULT VALUES</b> benötigt:
      <pre>
      INSERT TestTbl DEFAULT VALUES
      </pre>
      Bei den SQL-Anweisungen, die die ADO-Objekte automatisch generieren, wird dies jedoch nicht berücksichtigt. Der Sonderfall, dass eine Tabelle nur aus dem Primärschlüsselwert besteht, ist so extrem selten, dass in diesem Fall <br>a) entweder die INSERT-Anweisung als solches abgeschickt werden muss, oder <br>b) das Ganze in eine Stored Procedure verpackt werden sollte

      Comment

      Working...
      X