Announcement

Collapse
No announcement yet.

Problem SQL und Autoincrement-Field

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

  • Problem SQL und Autoincrement-Field

    Hallo,<br>
    <br>
    ich habe ein Problem Werte in meine Tabelle per SQL zu schreiben.<br>
    Das Problem ist (soweit ich das vermute), das AutoInc-Feld, dass existiert.<br>
    <br>
    <PRE>
    WITH table.FieldDefs DO
    BEGIN
    clear;
    add('ID', ftAutoInc, 0, true);
    add('Zeit', ftTime, 0, true);
    add('Datum', ftDate, 0, true);
    add('Place', ftString, 255, false);
    add('Text', ftString, 255, false);
    add('Pic', ftBlob, 0, false);
    END;
    </PRE>
    Das Feld ID ist auch als Primärindex ausgelegt. <br>
    Die Werte werden per Query gespeichert:<br>
    <PRE>
    DirectQuery.SQL.Add('INSERT INTO test (Zeit, Datum) VALUES (NULL, 1, 2, NULL, NULL, NULL)');
    DirectQuery.Params[0].AsDateTime := Time;
    DirectQuery.Params[1].AsDateTime := Date;
    DirectQuery.Execute;
    </PRE>
    Ich wollte testweise nur zwei der Spalten füllen...

    Ich bekomme aber immer eine "Invalid parameter"-Fehlermeldung und kann mit diesem Fehler einfach nichts anfangen.
    Wenn ich das ganze mit UPDATE durchführe funktioniert es, ich würde aber gerne den Datensatz komplett in SQL erzeugen.
    Ich bin für jede Hilfe dankbar.

    grüsse
    Sebastian

  • #2
    Hallo Sebastian

    in dem Beispiel gibst Du 2 Parameter vor (Zeit und Datum) versuchst aber 6 Parameterwerte zu übergeben.

    Lösungsmöglichkeiten:
    entweder alle Parameter angegeben (die vier fehlenden (???, Zeit, Datum, ???, ???, ???)
    oder die NULL-Werte aus der Zeile mit den Values rauslassen.

    Grüße Joche

    Comment


    • #3
      ach ja, AutoInc-Felder lässt Du beim Insert / Update einfach weg

      Comment


      • #4
        Hallo Jochen,

        das habe ich bereits versucht.
        Wenn ich das AutoInc-Feld in der Spaltenliste mit angebe, bekomme ich einen Fehler, das ist zu erwarten, da ich diesen Wert nicht ändern kann. <br>
        <br>
        Ich übergebe 6 Parameter, da ich gelesen habe (und auch in Beispielen gesehen und auch getestet), dass man immer alle Spalten mit Werten (und sei es mit NULL) übergeben muss, ansonsten kommt eine Fehlermeldung: "Field value required".
        Diesen Fehler kann ich nur vermeiden, indem ich alle Werte übergebe.<br>
        Das Autoinc-Feld ist davon aber nicht betroffen.<br&gt

        Comment


        • #5
          Ja, aber dann mußt du auch alle Feldnamen angeben, wenn Du nur zwei Feldnamen angibst, kannst Du auch nur 2 Parameter übergeben - und nicht 6.

          Grüße Joche

          Comment


          • #6
            Der Fehler kommt unabhängig von der Anzahl der Feldnamen oder Werte.<br>
            Es stimmt nicht, dass ich Feldwerte weglassen kann, ich muss alle Werte angeben, ausser das Autoinc-Feld..<br>
            Folgende Sachen habe ich getestet (sinnvoll):<br>
            <br>
            <PRE>
            1. 'INSERT INTO test (Zeit, Datum) VALUES (ara1, ara2)'
            </PRE>
            FEHLER: Field value required<br>
            <br>
            <PRE>
            2. 'INSERT INTO test (Zeit, Datum) VALUES (NULL,ara1, ara2,NULL,NULL,NULL)'
            </PRE>
            FEHLER: Invalid parameter<br>
            <br>
            <PRE>
            3. 'INSERT INTO test (Zeit, Datum,Place,Text,Pic) VALUES (NULL, ara1, ara2,NULL,NULL,NULL)'
            </PRE>
            FEHLER: Invalid parameter<br>
            <br>
            <PRE>
            4. 'INSERT INTO test (ID,Zeit, Datum,Place,Text,Pic) VALUES (NULL,ara1, ara2,NULL,NULL,NULL)'
            </PRE>
            FEHLER: INSERT and UPDATE operations are not supported for autoincrement field type.<br>

            Kannst du den Fehler nachvollziehen, bzw. Quellcode erzeugen, der erfolgreich Werte in die Datenbank speichert (ohne BLOB reicht schon).

            Danke für die Hilfe,
            Sebastia

            Comment


            • #7
              1. 'INSERT INTO test (Zeit, Datum) VALUES (ara1, ara2)'

              Das sollte funktionieren, solange keines der nicht angegebenen Felder als NOT NULL definiert ist.

              2. 'INSERT INTO test (Zeit, Datum) VALUES (NULL,ara1, ara2,NULL,NULL,NULL)'

              Kann nicht funktionieren.

              3. 'INSERT INTO test (Zeit, Datum,Place,Text,Pic) VALUES (NULL, ara1, ara2,NULL,NULL,NULL)'

              Kann nicht funktionieren.


              4. 'INSERT INTO test (ID,Zeit, Datum,Place,Text,Pic) VALUES (NULL,ara1, ara2,NULL,NULL,NULL)'

              FEHLER: INSERT and UPDATE operations are not supported for autoincrement field type.

              Funktionieren sollte:

              'INSERT INTO test (Zeit, Datum,Place,Text,Pic) VALUES (ara1, ara2,NULL,NULL,NULL)'
              ´
              Wenn das nicht funktioniert, poste mal die Tabellenstruktur (alle Felder und deren Typ).

              Grüße Joche

              Comment


              • #8
                Hallo Jochen, <br>
                <br>
                danke für die Geduld..<br>
                1. funktioniert nicht, 5. auch nicht<br>
                <br>
                Hier die Struktur:<br>
                <br>
                <PRE>
                Table := TTable.create(self);
                // Parameter setzen
                table.TableName := 'test';
                table.TableType := ttParadox;
                // Felder definieren
                WITH table.FieldDefs DO
                BEGIN
                clear;
                add('ID', ftAutoInc, 0, true);
                add('Zeit', ftTime, 0, true);
                add('Datum', ftDate, 0, true);
                add('Place', ftString, 255, false);
                add('Text', ftString, 255, false);
                add('Pic', ftBlob, 0, false);
                END;
                // Index erstellen
                WITH table.IndexDefs DO
                BEGIN
                Clear;
                WITH AddIndexDef DO
                BEGIN
                Name := '';
                Fields := 'ID';
                Options := [ixPrimary];
                END;
                END;
                // Tabelle erstellen
                IF NOT table.exists THEN
                table.CreateTable;
                Table.Open;
                </PRE>
                Zugriff über:<br>
                <PRE>
                DirectQuery := TQuery.Create(self);
                DirectQuery.SQL.Clear;
                DirectQuery.SQL.Add('INSERT INTO test (Zeit, Datum) VALUES (ara1, ara2)');
                TRY
                Table.Append;
                Table.FieldByName('Zeit').AsDateTime := Time;
                Table.FieldByName('Datum').AsDateTime := Date;
                Table.FieldByName('Place').AsString := Place;
                Table.FieldByName('Text').AsString := Text;
                Table.Post;
                EXCEPT
                ShowMessage('Unable to add new record');
                FatalError := true;
                exit;
                END;
                stream.Clear;
                jpeg.SaveToStream(stream);
                Stream.Position := 0;
                TRY
                UpdateQuery.Params[0].LoadFromStream(Stream, ftBlob);
                UpdateQuery.Params[1].AsInteger := Table.FieldValues['ID'];
                UpdateQuery.ExecSQL;
                EXCEPT
                ShowMessage('Unable to write image');
                FatalError := true;
                exit;
                END;
                </PRE&gt

                Comment


                • #9
                  Hallo Jochen,<br>
                  <br>
                  danke für die Geduld..<br>
                  1. funktioniert nicht, 5. auch nicht<br>
                  <br>
                  Hier die Struktur:<br>
                  <PRE>
                  Table := TTable.create(self);
                  // Parameter setzen
                  table.TableName := 'test';
                  table.TableType := ttParadox;
                  // Felder definieren
                  WITH table.FieldDefs DO
                  BEGIN
                  clear;
                  add('ID', ftAutoInc, 0, true);
                  add('Zeit', ftTime, 0, true);
                  add('Datum', ftDate, 0, true);
                  add('Place', ftString, 255, false);
                  add('Text', ftString, 255, false);
                  add('Pic', ftBlob, 0, false);
                  END;
                  // Index erstellen
                  WITH table.IndexDefs DO
                  BEGIN
                  Clear;
                  WITH AddIndexDef DO
                  BEGIN
                  Name := '';
                  Fields := 'ID';
                  Options := [ixPrimary];
                  END;
                  END;
                  // Tabelle erstellen
                  IF NOT table.exists THEN
                  table.CreateTable;
                  Table.Open;
                  </PRE>
                  Zugriff über:<br>
                  <PRE>
                  DirectQuery := TQuery.Create(self);
                  DirectQuery.SQL.Clear;
                  DirectQuery.SQL.Add('INSERT INTO test (Zeit, Datum) VALUES (ara1, ara2)');
                  DirectQuery.Params[0].AsDateTime := Time;
                  DirectQuery.Params[1].AsDateTime := Date;
                  DirectQuery.ExecSQL;
                  </PRE&gt

                  Comment


                  • #10
                    Versuch mal:
                    <br>
                    <pre>
                    DirectQuery := TQuery.Create(self);
                    DirectQuery.DataBaseName:= ''; <<-- das fehlt
                    DirectQuery.SQL.Clear;
                    DirectQuery.SQL.Add('INSERT INTO test (Zeit, Datum) VALUES (ara1, ara2);');
                    DirectQuery.ParamByName('para1').AsDateTime := Time;
                    DirectQuery.ParamByName('para2').AsDateTime := Date;
                    DirectQuery.ExecSQL;
                    </pre>
                    <p>
                    Abgesehen von DirectQuery.DataBaseName sehe ich keine Probleme, <br>
                    abgesehen davon, dass du mit einer Query und 'Create Table' die Tabelle "schöner" anlegen kannst..
                    <br>Existiert die Tabelle überhaupt ?

                    Heik

                    Comment


                    • #11
                      yep, Heiko hat den Nagel auf den Kopf getroffen. Ich Blindfisch...

                      Sorry,

                      Joche

                      Comment


                      • #12
                        danke, ich probier das morgen gleich mal aus.. war die letzen Tage nicht im Büro

                        Grüsse
                        Sebastia

                        Comment


                        • #13
                          Sorry, aber das war nicht das Problem (ist ja auch SQL, warum soll da die Datenbank extra angegeben oder weggelassen werden?)...

                          Ist das nur bei mir so? Habt ihr den Quellcode selber laufen lassen und er funktioniert?
                          Irgend jemand eine andere Idee?
                          Langsam bin ich nur noch verwirrt...

                          Danke im Vorau

                          Comment


                          • #14
                            Hallo Sebastian,

                            ja, ich hab's ausprobiert (in etlichen Anwendungen ) und bei mir funktioniert es. Der einzige Unteschied ist, das ich meine Query nicht zur Laufzeit erzeuge. Diese habe ich bereits auf einem DataModule und modifiziere zur Laufzeit nur die eigentliche Anweisung...

                            Folgendes könntest Du noch probieren:<BR>
                            Ist ParamCheck der Query auf true?<BR>
                            (Unwahrscheinlich, aber...) RequestLive auf true setzen. <BR>
                            Den Tabellennamen mal von test in "Test.DB" ändern.

                            Grüße Joche

                            Comment

                            Working...
                            X