Announcement

Collapse
No announcement yet.

Seltsamer Fehler bei Abfrage

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

  • Seltsamer Fehler bei Abfrage

    Delphi2007, FIBPlus-Komponenten, Firebird 2.1.1

    Wenn ich folgenden Code in Delphi ausführe, bekomme ich eine Fehlermeldung ("Zugriffsverletzung bei Adresse 004FA852 in Modul 'Abo.exe'. Lesen von Adresse 00000058."):

    with DM_Abo.DataModuleAbo.pFIBTermineQuery do
    begin
    Close;
    SQL.Clear;
    SQL.Add('select COUNT(ITEMKEY) from TERMINE where RECURRENCY IS NOT NULL ');
    SQL.Add('and KID IS NOT NULL and WID IS NOT NULL ');
    SQL.Add('and MAXTIME>='''+'24.10.2008 00:00:01'+''' ');
    SQL.Add('and MINTIME<='''+'24.10.2008 23:59:59'+'''');
    ExecQuery;
    anz2:=FieldByName('COUNT').AsInteger;
    Close;
    end;

    Führe ich den Code aber direkt im SQL-Server aus (getestet mit SQL-Hammer), dann funktioniert das einwandfrei.

    Irgendeine Idee???

    Hartmut

  • #2
    Hi Hartmut.

    Der Code kann ja nur bei ExecQuery abstürzen. Richtig?

    Lass doch mal den String ausgeben ob der auch eine korrekte Syntax hat.

    So nach dem Motto.

    ShowMessage(
    'select COUNT(ITEMKEY) from TERMINE where RECURRENCY IS NOT NULL ' +
    'and KID IS NOT NULL and WID IS NOT NULL ' +
    'and MAXTIME>='''+'24.10.2008 00:00:01'+''' ' +
    'and MINTIME<='''+'24.10.2008 23:59:59'+''''
    );

    Vielleicht hast Du was übersehen?

    Ansonsten vereichfache doch mal die Abfrage hier und lasse "and Maxtime und and Mintime" mal weg.

    Wenn der dann immer noch crasht dann hast Du ein Problem.


    Ich gebe ja zu das ich totaler Anfänger bin.
    Aber mir ist aufgefallen das eine Abfrage auf der Zeit bei 'and MAXTIME>='''+'24.10.2008 00:00:01'+' gemacht wird.
    Was ist dem mit der Zeit 00:00:00.
    Dieser Datensatz würde nie berücksichtigt werden.
    Ist das ein Fehler oder ist das gewollt?

    Comment


    • #3
      Hi,

      mir erscheint das Statement

      anz2:=FieldByName('COUNT').AsInteger;

      sehr dubios.

      Normalerweise gibt man bei FieldbyName doch echte Feldnamen aus einer Tabelle an und keine Aggregatsfunktionen, oder sollte mir da etwas entgangen sein?

      Gruß
      docendo discimus

      Comment


      • #4
        Hallo,

        solltest Du statt dem ExecQuery nicht ein Open machen?


        Thomas
        Thomas Steinmaurer

        Firebird Foundation Committee Member
        Upscene Productions - Database Tools for Developers
        Mein Blog

        Comment


        • #5
          Hallo,

          und

          Open;
          try
          anz2:=Fields[0].AsInteger;
          finally
          Close
          end;


          Heiko

          Comment


          • #6
            Also zunächst mal danke für die Ideen - ich musste wegen eines massiven grippalen "Defektes" für einige Zeit aussetzen.

            1. Maxtime-Abfrage ist korrekt, da die Zeiten nur zwischen ca. 6 und 22 Uhr liegen
            2. Bei FIBPlus wir eine Query immer mit ExecQuery ausgeführt - im Gegensatz dazu wird ein DataSet mit Open geöffnet/ausgeführt.
            3. FieldByName('COUNT').AsInteger; ist absolut korrekt und fuunktioniert einwandfrei - als Alternative gibt es noch Recordcount, das aber in den bisherigen Versionen von FIBPlus mit Firebird<2.x nicht korrekt funktionierte.

            Und jetzt kommts: der Fehler lag darin, dass ich die Abfrage in der Create-Procedure des Fensters ausgeführt habe und nicht - wie jetzt - in der OnShow-Procedure. Erklärung hab' ich keine dafür, aber jetzt geht's...

            Hartmut

            Comment


            • #7
              Moin Hartmut.

              OnShow würde ich aber nicht benutzen.
              Das wird ja unter umständen mehrfach aufgerufen.

              Damit fängst Du Dir mehr Fehler als das einen Nuten bringt.


              Torsten

              Comment

              Working...
              X