Entwickler-Ecke

Datenbanken - EAccessViolation bei ExecSQL


Rupert - Do 23.05.13 17:32
Titel: EAccessViolation bei ExecSQL
EAccessViolation bei ExecSQL
Verwende Absolute Database.

Ich finden den Fehler nicht, wahrscheinlich habe ich schon einen Tunnelblick ;)
Den SQL-Table habe ich schon umbenannt und dann neu erstellt.

Der Fehler tritt in Zeile 14 auf und ich habe keinen Schimmer, was ich hier falsch gemacht haben soll.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
  Data.ABSQuery1.open;
  with Data.ABSQuery1 do begin
  repeat
    Data.ABSQuery1.first;

    FName:=Data.Teilnehmer.FieldByName('Name').asstring;
    VName:=Data.Teilnehmer.FieldByName('Vorname').asstring;
    Gruppe:=Data.Teilnehmer.FieldByName('Gruppe').asstring;
    inc(Reczaehler,1);
    // Tabelle schließen und filtern berechnen
    if Fname<>'' then begin
        SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' and Name='''+FName+''' AND Vorname='''+VName+''' AND Gruppe='''+Gruppe+'''order by PunkteNe desc';
      Data.ABSQuery1.SQL.Text:=SQLString;
      Data.ABSQuery1.ExecSQL;
      Data.ABSQuery1.Active:=true;

    // Punktesumme berechnen
      Data.ABSQuery1.first;
      DBGrid7.Refresh;
    // Nullsetzen aller Temporärwerte
      PktGes:=0;
      SumNetto:=0;
      PktSNe:=0;
      PktS5:=0;
      SumPunkte:=0;
      PunkteSchnitt:=0;
      PunkteGes:=0;
      PktGesNe:=0;
      PunkteS5Br:=0;
      PunkteS5N:=0;

      Anzahl_Ergebnisse:=Data.ABSQuery1.RecordCount;
      if Anzahl_Ergebnisse <> 0 then begin

        for i:=1 to Anzahl_Ergebnisse do begin
          PktGesNe:=PktGesNe+Data.ABSQuery1.FieldByName('PunkteNe').asinteger;
          PunkteGes:=PunkteGes+Data.ABSQuery1.FieldByName('PunkteBr').asinteger;

          Data.ABSQuery1.next;
        end;
      // Schnitt gesamt
        PktSNe:=int(PktGesNe/Anzahl_Ergebnisse*1000)/1000;
        PunkteSchnitt:=int(PunkteGes/Anzahl_Ergebnisse*1000)/1000;

        Data.ABSQuery1.first;
      // nur die besten 5 Ergebnisse
        if Anzahl_Ergebnisse >= 5 then zaehler:=5 else zaehler:=Anzahl_Ergebnisse;
        for i:=1 to zaehler do begin
          SumNetto:=SumNetto+Data.ABSQuery1.FieldByName('PunkteNe').asinteger;
          SumPunkte:=SumPunkte+Data.ABSQuery1.FieldByName('PunkteBr').asinteger;
          Data.ABSQuery1.next;
        end;
      //Schnitt der besten 5 Turniere
      // Gruppe A und Brutto
        PunkteS5Br:=int(SumPunkte*1000/zaehler)/1000;
        PunkteS5N:=int(SumNetto*1000/zaehler)/1000;

      // Punktesumme eintragen
        Data.ABSQuery1.first;
        for i:=1 to Anzahl_Ergebnisse do begin
          Data.ABSQuery1.edit;
          Data.ABSQuery1.FieldByName('SumTur').asinteger:=Anzahl_Ergebnisse;
          begin
            Data.ABSQuery1.FieldByName('SumBr').asinteger:=SumPunkte;
            Data.ABSQuery1.FieldByName('SumNe').asinteger:=SumNetto;
            Data.ABSQuery1.FieldByName('PktGes').asinteger:=PktGesNe;
            Data.ABSQuery1.FieldByName('PktS').asfloat:=PunkteSchnitt;
            Data.ABSQuery1.FieldByName('PktS5B').AsFloat:=PunkteS5Br;
            Data.ABSQuery1.FieldByName('PktS5').AsFloat:=PunkteS5N;
          end;
          if Anzahl_Ergebnisse >=5 then Data.ABSQuery1.FieldByName('Tur5').asinteger:=1
                                   else Data.ABSQuery1.FieldByName('Tur5').asinteger:=0;
          Data.ABSQuery1.post;
          Data.ABSQuery1.next;
        end;
      end//if anzahl der Ergebnisse
    end//of if Fname<>''
    Data.Teilnehmer.next;
  until Data.Teilnehmer.eof;
  end//with ABSQuery1

  Data.ABSQuery1.Active:=false;
  SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' order by SumNe desc, PunkteNe desc';
  Data.ABSQuery1.SQL.Text:=SQLString;
  Data.ABSQuery1.ExecSQL;
  Data.ABSQuery1.Active:=true;
  DBGrid7.Refresh;
  Screen.Cursor:=crDefault;


Lemmy - Do 23.05.13 17:35

nur ne ganz wilde Vermutung: Hast Du schon mal .Open; anstelle von .Execute; verwendet? Execute verwendet man i.A. bei DDL oder AUfrufen die kein Ergebnis zurück liefern, open dagegen bei Select-Anweisungen.... Das Anschließende .ACtive; würde zumindest darauf hindeuten, das Du dir im übrigen auch sparen kannst...

Grüße


Rupert - Fr 24.05.13 11:13

Ich habe die Routine nun auf die Fehlererfassung "abgespeckt"

'select * from Ergebnisse where extract (year from datum)=2013 and Gruppe='A''
generell Fehlerfrei

1. Durchlauf:
'select * from Ergebnisse where extract (year from datum)=2013 and Gruppe='A' and Name='BUCHBERGER''
fehlerfrei
2. Durchlauf:
Exeption bei "Data.ABSQuery1.close"

Das ließ den Schluss zu, dass es sich nur mehr um das Feld Name handeln kann.

Die Lösung:
Änderen der Variable Name in FamName

Manchmal sind die Dinge plausibel - aber bis man es behirnt vergehen viele Stunden :idea:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  repeat
    Data.ABSQuery1.open;
    FName:=Data.Teilnehmer.FieldByName('Name').asstring;
    VName:=Data.Teilnehmer.FieldByName('Vorname').asstring;
    Group:=Data.Teilnehmer.FieldByName('Gruppe').asstring;
    inc(Reczaehler,1);
    Data.ABSQuery1.close;
    Data.ABSQuery1.RequestLive:=true;
    Data.ABSQuery1.SQL.Clear;

    if Fname<>'' then begin
      SQLString:='select * from Ergebnisse where extract (year from datum)='+inttostr(aktjahrwert)+' and Gruppe='''+Group+''' and Name='''+FName+'''';
      Data.ABSQuery1.SQL.Add(SQLString);
      Data.ABSQuery1.open;
    end//of if Fname<>''
    Data.Teilnehmer.next;
  until Data.Teilnehmer.eof;