Announcement

Collapse
No announcement yet.

Nicht-Blob-Spalte -- Fehler beim Table.Post

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

  • Nicht-Blob-Spalte -- Fehler beim Table.Post

    Hallo,
    ich habe folgende merkwuerdige Erscheinung??????
    Beim Post auf ein Table kommt folgende Meldung:
    --Fuer diese Operation ist eine Nicht-Blob-Spalte in der
    Tabelle erforderlich--.

    Was bedeutet diese Meldung?

    Sie kommt nur in einem best. Fall:
    ich habe eine Tabelle mit eigens erzeugten DOMAINS erstellt und die gleiche
    Tabelle in der ich die Datentypen direkt angibt. Der Fehler tritt jetzt
    nur in der Tabelle auf in der ich die DOMAINS benutze in der anderen nicht.

    Ich benutze Delphi 5 und InterBase 5.6.

    Mein Delphi - QuellCode den ich benutze:
    Table1.open;
    Table1.append;
    Table1DIRID.asinteger := 1;
    Table1INHALTID.asinteger := 0;
    Table1.post; // HIER TRITT DER FEHLER AUF!!!!!!!!!!
    Table1.close;

    Meine zwei Tabelle-Definitionen:
    (ich habe die Tabellen abwechselnd erzeugt und geloescht um den gleichen
    Generator und Trigger zu benutzen. Die DOMAINS entsprechen den Datentypen)

    create table TEST (
    ID integer NOT NULL,
    DIRID integer,
    NAME VARCHAR(255) CHARACTER SET WIN1252,
    EXTENSION VARCHAR(255) CHARACTER SET WIN1252,
    TYP VARCHAR(255) CHARACTER SET WIN1252,
    GROESSE integer,
    DATUM DATE,
    INHALTID integer,
    ICON BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PRIMARY KEY (ID))

    create table TEST (
    ID ID,
    DIRID ID,
    NAME NAME,
    EXTENSION FILEEXT,
    TYP DATEITYP,
    GROESSE FILESIZE,
    DATUM DATE,
    INHALTID ID,
    ICON ICON,
    PRIMARY KEY (ID))

    create generator GENTESTID;

    create trigger setTEST_ID for TEST
    active before insert position 0
    as
    begin
    new.id = GEN_ID (GENTESTID, 1);
    end;

  • #2
    Hallo,

    was passiert, wenn die Tabellenspalten als Namen nicht einen bereits vorhandenen Domain-Namen verwenden? Anstelle von "ID ID" bzw. "ICON ICON" sollte zu Test "TestID ID" bzw. "TestICON ICON" verwendet werden

    Comment


    • #3
      Hi,

      Danke fuer Deine Antwort.

      Ich habs so probiert, das ich bei den Tabellennamen keine bereits vorhanden Domain-Namen verwende, aber es
      funktioniert trotzdem nicht, also es kommt immer noch dieselbe Meldung. Es haette mich auch gewundert denn
      in meinen anderen Tabellendefinitionen funktioniert es ebenfalls.

      Erzeuge ich die Tabelle mit Domains und lass den Trigger weg, der mir die eindeutige ID fürs Feld ID erzeugt, dann
      kommt die Meldung nicht mehr und es funktioniert

      Comment


      • #4

        Comment


        • #5
          Hallo,

          was passiert, wenn der Client den Primärschlüsselwert beim OnNewRecord-Ereignis über eine Stored Procedure abfordert und direkt einsetzt:
          <pre>
          CREATE PROCEDURE GET_PROJNR
          RETURNS (ProjNr INTEGER) AS
          BEGIN
          ProjNr = GEN_ID(Gen_ProNr,1);
          END
          </pre>
          In diesem Fall kann der Trigger so erweitert werden, das er nur dann einen neuen Wert zuweist, wenn der Client keinen Wert überträgt (also wenn zum Beispiel direkt über SQL eine INSERT-Anweisung von Hand abgeschickt wird).
          <pre>
          CREATE TRIGGER Set_ProNr FOR ProMain BEFORE INSERT AS
          BEGIN
          IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1);
          END
          </pre>
          In diesem Fall kennt TTable den exakten Wert des Primärschlüssels und kann so in jedem Fall den neuen Datensatz richtig in der Ergebnismenge einsortieren. Ändert der Trigger allerdings den Primärschlüsselwert, so vergleicht TTable die Werte in allen restlichen Tabellenspalten (was beim BLOB-Feld zu einer Fehlermeldung führt).

          P.S: Wenn TTable.APPEND durch eine über TQuery abgeschickte INSERT-Anweisung ersetzt wird, sollte das Problem erst gar nicht auftauchen

          Comment


          • #6
            Hallo, na ja es hat etwas laenger gedauert, aber ich habe nun eine
            Loesung gefunden:

            Beim persistente Field, dass automatisch in der Tabelle ueber einen Trigger
            hochgezaehlt wird, muss die Eigenschaft AutoGenerateValue = arAutoInc haben.
            Somit kommt die Fehlermeldung ("Fuer diese Operation ist eine
            Nicht-Blob-Spalte erforderlich") nicht mehr.

            Um jetzt aber nach dem Post auf den ID Wert des neu eingefuegten Datensatzes
            zu kommen, genuegt es nicht einen Refresh aufs Table auszuloesen
            (Table.Refresh) sondernes es muss die Eigenschaft AutoRefresh des Tables
            auf True sein.

            Durch Ihre Aussage ("Aendert der Trigger allerdings den Primaerschluessel,
            so vergleicht TTable die Werte aller restlichen Spalten....") bin ich auf
            diese Idee, AutoGenerateValue = arAutoInc, gekommen.

            Mit einer Query und dazugehörigem SQL - Statement ("insert into .... ")
            funktioniert es auch, nur bekomme ich dann nicht die ID des neu erzeugten
            Satzes raus (vieleicht ueber StoredProcedures, ist mir aber im Vergleich
            zum Table zu umstaendlich).

            Danke nochmals fuer die Antworten.
            Michi :-

            Comment

            Working...
            X