Announcement

Collapse
No announcement yet.

IB Fehlermeldung Blob kann nicht mit Array verglichen werden

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

  • IB Fehlermeldung Blob kann nicht mit Array verglichen werden


  • #2
    Hallo,

    Folgender Fehler in IB6 und Delphi5 Prof:

    Zuerst der Code:

    procedure Tfrm_save.bbt_msaveClick(Sender: TObject);<br>
    var<br>
    mwObjekt : TStringStream;<br>
    blobwert : TStream;<br>
    neumwert, mwert, swert, fname : string;<br>
    neumwstrlen, mwstrlen, i : integer;<br>
    begin<br>
    if MessageDlg('Möchten Sie die Messung wirklich speichern ?'<br>
    , mtConfirmation, [mbYes, mbNo], 0) = mrYes then<br>
    begin<br>
    repeat<br>
    swert:= InputBox('Messung Speichern',<br>
    'Eine Beschreibung eingeben.Max.40 Zeichen','');<br>
    until length(swert)<=40;<br>
    swert:=swert+' '+DateToStr(Date)+','+TimeToStr(Time);<br>
    dbmod.ibdb_savemess.Open;<br>
    dbmod.ibt_savemess.StartTransaction;<br>
    dbmod.ibds_sm_save.Active:=true;<br>
    dbmod.ibds_sm_save.Append;<br>
    dbmod.ibds_sm_saveNAME.Value:=swert;<br>
    ......<br>
    for i:=1 to 401 do<br>
    begin<br>
    mwert:=mwert+floattostr(manu.tprec.trace[i])+'/';<br>
    end;<br>
    mwstrlen:=Length(mwert);<br>
    mwObjekt:=TStringStream.Create(mwert);<br>
    mwObjekt.Position:=0;<br>
    blobwert:=dbmod.ibds_sm_save.CreateBlobStream (dbmod.ibds_sm_saveMESSWERT,bmWrite);<br>
    blobwert.CopyFrom(mwObjekt,mwStrLen);<br>
    dbmod.ibds_sm_save.Post; //hier beim Posten kommt der Fehler<br>
    dbmod.ibds_sm_save.Active:=false;<br>
    dbmod.ibt_savemess.Commit;<br>
    dbmod.ibdb_savemess.Close;<br>
    end;<br>
    end;<br>

    Fehlermeldung:<br>
    Im Projekt ... ist eine Exception der Klasse EIBIntebaseError aufgetreten: 'feature is not supported'. BLOB and ARRAY types are not supported for compare operation.

    Im String mwert stehen nur '1234567890/+-'.

    Danke Walte

    Comment


    • #3
      Hallo,

      das hört sich so an, also ob die BLOb-Spalte auch in der WHERE-Klausel der SQL-Anweisung verwendet wird (was natürlich illegal wäre). Wie sieht der SQL-Teil von ibds_sm_save aus (Datenmodul | Darstellung als Text)

      Comment


      • #4
        Hallo Andreas,

        ja, ich habe das BLOB-Feld in meiner WHERE abfrage. Wenn ich es allerdings ohne WHERE Abfrage probiere bekomme ich die gleiche Fehlermeldung!

        Hier meine Eintragungen in ibds_sm_save:

        INSERT SQL:

        insert into SAVEMESS
        (NAME, CF, SPAN, RL, DBDIV, ATT, SWP, RBW, VBW, MHOLD, DPL1DB,
        DPL1STAT,
        DPL2DB, DPL2STAT, CFSTAT, PMSTAT, MASTAT, MAPOS, MBSTAT, MBPOS,
        MO,
        DATERF, BEM, MX, MESSWERT)<br>
        values<br>
        (:NAME, :CF, :SPAN, :RL, BDIV, :ATT, :SWP, :RBW, :VBW, :MHOLD, PL1DB,
        PL1STAT, PL2DB, PL2STAT, :CFSTAT, :PMSTAT, :MASTAT, :MAPOS,
        :MBSTAT,
        :MBPOS, :MO, ATERF, :BEM, :MX,:MESSWERT)

        Select SQL (egal wie):

        1. -> select * from SAVEMESS where 1=2<br>
        2. -> select * from SAVEMESS

        Habe es auch probiert statt * alle Spalten einzeln zu benennen und MESSWERT auszuschließen, dann bekomme ich die Meldung das MESSWERT nicht bekannt ist.

        Gruß Walte

        Comment


        • #5
          Hallo,

          wie sieht <B>RefreshSQL</b> und <b>UpdateSQL</b> aus? Taucht dort das BLOb-Feld in der <b>WHERE</b>-Einschränkung auf. Beim INSERT gibt es keine WHERE-Einschränkung

          Comment


          • #6
            Hallo,

            erst mal Danke! RefreshSQL und UpdateSQL sind leer.

            Gruß Walte

            Comment


            • #7
              Hallo Andreas,

              Danke!!!!! Endlich kann ich mein Projekt zu Ende bringen. Du hast recht, in beiden SQL's wurde in der WHERE Abfrage MESSWERT:=MESSWERT gefunden. Aber wiso wird dort automatisch ein Eintrag erzeugt? Ich habe die Anweisungen nicht hineingeschrieben. Und wenn ich später ein Refresh oder ein Update von MESSWERT machen möchte, geht das auch ohne die WHERE klausel?

              Viele Grüße Walte

              Comment


              • #8
                Hallo Walter,

                zur Sicherheit generiert IBX die SQLs so, dass als WHERE-Einschränkung alle "alten" Spaltenwerte beim UPDATE etc. verglichen werden. Hat ein anderer Benutzer in der Zwischenzeit diesen Datensatz geändert, passt diese Einschränkung nicht mehr, so dass man sich gegenseitig die Änderungen nicht überschreibt. Allerdings darf eine BLOb-Spalte nicht über WHERE verglichen werden, so dass man hier von Hand eingreifen muss, um diese Spalte zu entfernen. Der einzige Nachteil besteht darin, dass IBX nun nicht mehr erkennen kann, ob dieser Datensatz in der Zwischenzeit von einem anderen Benutzer im BLOb-Feld geändert wurde - aber das wird in den meisten Fällen tolerierbar sein. Wenn nicht, müsste man eine zusätzliche Spalte in der Tabelle vorsehen, die von einem Trigger nach jedem Update "neu abgestempelt" wird, damit IBX diese Änderung in jedem Fall erkennen kann

                Comment


                • #9
                  Hallo Andreas,

                  vielen Dank für Deine Hilfe und die Info's!!!

                  Gruß Walte

                  Comment

                  Working...
                  X