Announcement

Collapse
No announcement yet.

SQLite Type Mismatch Error wenn kein EIntrag in der Datenbank

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

  • SQLite Type Mismatch Error wenn kein EIntrag in der Datenbank

    Hi,
    ich habe folgendes Problem:

    Ich arbeite mit der Community Editon Delphi 10.4 von Emarcadero unter Windows 11.

    in meinem Projekt benutze ich eine sqlite Datenbank. Die Tabellen sind via Datamodule eingebunden.
    In einer der Tabellen speichere ich Bilder und verknüpfe die später mit einer anderen Tabelle, die Tags für die Bilder enthält.

    Wenn ich ein Bild im Projekt auswähle, habe ich keine Probleme dieses in der Tabelle zu finden und alles läuft normal.

    Wenn ich ein Bild im Projekt auswähle, dass noch nicht in der Tabelle 'pics' vorhanden ist, bekomme ich nach dem SELECT-Statement beim OPEN den Fehler

    "QPics: Type mismatch for field 'id_pics', expecting: LargeInt actual: WideMemo. "

    Wie gesagt, mit vorhandenem Bild läuft die Abfrage völlig normal. Das heißt, es kann nicht an der Datenbank an sich liegen. Die ist zum Zeitpunkt des OPEN geöffnet, aktiv etc...
    Hier mal ein Auszug aus dem Sourcecode:

    //images available?
    if ListBox1.Count > 0 then //Das Bild wird beim Programmstart ausgewaehlt und in eine Listbox geladen
    begin

    if Datmod.Datamodule1.SQLConn.Connected = false then FSlideShow.open_SQLConn;

    l_picname:= ListBox1.Items[ListBox1.ItemIndex];

    //get picID for selected image from ListBox
    with Datmod.Datamodule1.QPics do
    begin

    with SQL do
    begin
    CLEAR;
    ADD('SELECT * FROM pics');
    ADD('WHERE picname = icname');
    Params.ParamByName('picname').AsString := l_picname;
    end;

    Open; // Hier kommt der Fehler - eine Abfrage auf IsEmpty ist schon nicht mehr moeglich

    if Datmod.Datamodule1.Qpics.IsEmpty then
    showmessage('No records found!')


    Hier die Datentypen der Tabelle pics:
    QPics: TSQLQuery;
    QPicsid_pics: TLargeintField;
    QPicspicname: TWideMemoField;
    QPicspicdate: TWideMemoField;
    QPicsfavorite: TWideMemoField;
    QPicsremarks: TWideMemoField;
    QPicsdrive: TLargeintField;

    Der Fehler kommt übrigens bei allen anderen Tabellen der Datenbank bei gleicher Situation (Element nicht in der DB vorhanden) vor.

    Es muss doch der Versuch möglich sein, die Tabelle mit dem ausgewählten Bild zu lesen und dann zu checken, ob das Bild vorhanden ist oder nicht, oder?

    Ich hoffe alle notwendigen Informationen mitgegeben zu haben und natürlich, dass mir hier geholfen werden kann.
    Vielen Dank
    Andreas

  • #2
    Nach Delphi verschoben.
    Ggf. sollte ein
    select count(*) from pics where picname=xxx
    eine 0 liefern
    Christian

    Comment


    • #3
      Hi,
      habe das mal ausprobiert. Aber dann kommt der Fehler:
      "...Project xxx raised exception class EDatabaseError with message '[0x0005]: Operation Not Supported'."
      Hier ist der source code dazu:

      ************************************************** ************************************************** **********************************
      if Datmod.Datamodule1.SQLConn.Connected = false then FSlideShow.open_SQLConn; //check status der Datenbank

      l_picname:= ListBox1.Items[ListBox1.ItemIndex];

      //Select mit Bildnamen aus der ListBox
      with Datmod.Datamodule1.QPics do
      begin

      with SQL do
      begin
      CLEAR;
      ADD('SELECT count(*) from pics');
      ADD('WHERE picname = icname');
      Params.ParamByName('picname').AsString := l_picname;
      end;

      Open;

      if Datmod.DataModule1.QPics.RecordCount = 0 then
      showmessage('No records found!')
      else
      begin
      ************************************************** ******************

      Was stimmt hier nicht?
      Gruss Andreas

      Comment


      • #4
        Lade dir
        https://sqlitestudio.pl/
        runter, um die SQL zu testen (kostenlos)

        Sofern ich mich nicht vertippt habe, ist das korrektes SQL
        Du hast ein Delphi-Problem; da Delphi tot ist, wäre eine andere Sprache sinnvoll
        Versuche erst ein "SELECT count(*) from pics". Das sollte die Anzahl der Datensätze zurückgeben
        Christian

        Comment


        • #5
          Hallo,
          danke , dass Du noch bei der Stange bist .... Ich hatte gerade ein paar Tage keine Zeit, sorry!

          sqlitestudio kenne ich, benutze aber selbst DBeaver. Dort funktioniert SELECT COUNT(*) auch.
          In Delphi bekomme ich es nur mit einem Integer hin, also z. B für den primary key (bei mir das Feld id_pic).

          Ich habe alles probiert - aber nichts anderes ging. Ich weiß nicht, ob eine Abfrage mit Count(*) nur mit Integer umgehen kann - glaube ich aber nicht.

          Ist aber auch egal und ich habe auch keine Lust mehr, damit herum zu experimentieren. Denn:
          Oh Wunder, aber meine ursprüngliche Idee, über den Namen zu gehen und dann mit IsEmpty zu prüfen, ob das Bild in der DB vorhanden ist oder nicht, hat jetzt geklappt!

          Ich weiß nicht genau warum, denn ich sehe eigentlich keinen Unterschied zu meiner ersten Version des SourcCodes, die ich beim Start hier in meiner Anfrage gepostet habe.
          Geklappt hat es mit dieser Version:

          //get picID for selected image from ListBox
          with QPics do
          begin
          with SQL do
          begin
          clear;
          ADD('SELECT * from pics');
          ADD('WHERE picname = icname');
          Params.ParamByName('picname').AsString := ListBox1.Items[ListBox1.ItemIndex];
          end;
          Open;

          if QPics.IsEmpty = true then
          showmessage('No records found!')
          else
          begin
          showmessage('Record(s) found for picname: ' + ListBox1.Items[ListBox1.ItemIndex]);

          Hierr noch zwei Anmerkungen

          1) Die einzige Änderung, die ich jetzt gemacht habe: Bei der Parameterzuweisung benutze ich jetzt keine Variable mehr, sondern „ListBox1.Items[ListBox1.ItemIndex]“.
          Aber ich kann mir nicht wirklich vorstellen, dass das den Erfolg gebracht haben soll…

          2) Zu Deiner Bemerkung
          „...Du hast ein Delphi-Problem; da Delphi tot ist, wäre eine andere Sprache sinnvoll…“

          Also das Delphi tot sei ist mir neu! Es ist eine schon ältere Sprache - ok, aber das ist kein Problem für mich. Und für die Dinge, mit denen ich mich beschäftige (rein privat), reicht es allemal!
          Zudem arbeite ich schon sehr lange an diesem Projekt mit den Bildern. Da ist vieles über die Zeit gewachsen und es wäre ein irrer Aufwand, dass in eine andere Sprache zu migrieren.

          Außerdem kann ich mir auch nicht vorstellen, dass das Problem, weswegen ich hier gepostet habe, mit dem Alter von Delphi zusammenhängt.

          Sicher,es gibt mittlerweile bestimmt andere, sehr interessante Lösungen, um Programme zu schreiben. Aber deswegen ist Delphi – zu mindestens in der Version, die ich benutze - für mich nicht ungeeignet.
          Aber da kann man natürlich unterschiedlicher Meinung sein.
          By the way: An welche Sprache hättest Du denn gedacht?

          Trotzdem Danke für Deine Anmerkungen!

          Für mich ist das Thema damit jetzt erst mal erledigt.
          Ich freue mich aber natürlich weiterhin über konstruktive, interessante Anmerkungen.

          Gruß Andreas

          Comment


          • #6
            Sicherlich kann und sollte ein count(*) ein Integer sein. Was sonst? Es ist die Anzahl der Datensätze.

            Also das Delphi tot sei ist mir neu!
            Das mag sein, ändert nichts an der Realität. Es konnte sich nicht gegen MS durchsetzen. Keiner wird irgendein Projekt mit Delphi, C++Builder (VCL) anfangen.Für Privat mag es anders sein
            https://www.tiobe.com/tiobe-index/

            Alternativen
            C#, Java
            Christian

            Comment


            • #7
              Originally posted by Christian Marquardt View Post
              Sicherlich kann und sollte ein count(*) ein Integer sein. Was sonst? Es ist die Anzahl der Datensätze.
              Hi, kurz noch dazu:
              Da hast Du mich missverstanden oder ich habe es missverständlich ausgedrückt. Das das Ergebnis von Count(*) ein Integer ist, das ist mir klar. Ich wundere mich nur, dass ich ein Ergebnis bekomme, wenn ich als Parameter für die Abfrage ein Tabellenfeld vom Typ Integer mitgebe, aber nicht, wenn ich ein Feld vom Typ String verwende! Dann bekomme ich eine Fehlermeldung
              "...Project xxx raised exception class EDatabaseError with message '[0x0005]: Operation Not Supported..."
              und das verstehe ich nicht so ganz...

              Comment


              • #8
                Originally posted by awb View Post
                Da hast Du mich missverstanden oder ich habe es missverständlich ausgedrückt.
                Ich wundere mich nur, dass ich ein Ergebnis bekomme, wenn ich als Parameter für die Abfrage ein Tabellenfeld vom Typ Integer mitgebe, aber nicht, wenn ich ein Feld vom Typ String verwende! Dann bekomme ich eine Fehlermeldung
                "...Project xxx raised exception class EDatabaseError with message '[0x0005]: Operation Not Supported..."
                und das verstehe ich nicht so ganz...
                Welchen Parameter gibst Du denn einer Count(*) Abfrage mit, wie sieht die Abfrage konkret aus?

                Gruß, defo

                Comment


                • #9
                  Originally posted by defo View Post
                  Welchen Parameter gibst Du denn einer Count(*) Abfrage mit, wie sieht die Abfrage konkret aus?
                  Hi defo, sorry - hatte ein paar Tage kein Internet. Die Angaben zu Deiner Frage findest Du hier weiter oben (#3 vom 12.8.). Ich weiß nicht, warum dort im source code ein smiley auftaucht. Im Original steht da 'picname' mit einem Doppelpunkt davor - hier im Editor wird ein "p" mit Hochkomma davor automatisch durch den smiley ersetzt. Das ist wahrscheinlich ein shortcut dafür...

                  Comment

                  Working...
                  X