Entwickler-Ecke
Datenbanken - Access Violation in einer UNIT (qry.open)
Dhakiyah - Mi 09.04.14 11:36
Titel: Access Violation in einer UNIT (qry.open)
Hallo!
Hab da ein kleines Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var qry_heute: TADOQuery; begin qry_heute := TADOQuery.Create(nil); qry_heute.Connection := dm.ADOConnection1; with qry_heute do begin close; SQL.Clear; SQL.ADD ('select sysdate() jetzt from dual'); ; end; qry_heute.open; Result := StrToDateTime(qry_heute.FieldByName('jetzt').AsString); qry_heute.Close; qry_heute.Free; end; |
Bei qry_heute.open knallt er mir raus.
Was mache ich falsch?
DB-Zugriff geht und DB Connected ist True.
Habe das Problem nur in der Unit, wenn ich es in einem Formular mit der Komponente mache gehts.
jaenicke - Mi 09.04.14 14:26
Was passiert denn? Schutzverletzung?
Abgesehen davon, dass da ein with drin ist, was ohnehin schon nicht schön ist, hast du in der Zeile mit dem SQL.Add am Ende der Zeile ein doppeltes Semikolon. Da hatte ich schon einmal richtig seltsame Effekte in Kombination mit with in der Form, dass der Compiler zwar keinen Fehler gebracht hat, aber fürchterlich darüber gestolpert ist und falsche Ergebnisse geliefert hat.
WasWeißDennIch - Mi 09.04.14 15:06
Ich würde es mal so versuchen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var qry_heute: TADOQuery; begin qry_heute := TADOQuery.Create(nil); try qry_heute.Connection := dm.ADOConnection1; qry_heute.SQL.Text := 'select sysdate() as jetzt from dual'; qry_heute.open; Result := StrToDateTime(qry_heute.FieldByName('jetzt').AsString); qry_heute.Close; finally qry_heute.Free; end; end; |
Oder wenn es unbedingt mit with sein muss (ich persönlich kann darauf verzichten):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| with TADOQuery.Create(nil) do try Connection := dm.ADOConnection1; SQL.Text := 'select sysdate() as jetzt from dual'; Open; Result := StrToDateTime(FieldByName('jetzt').AsString); Close; finally Free; end; |
Dhakiyah - Do 10.04.14 07:50
Moin!
Habe alle Varianten ausprobiert. Beim open knallt er raus mit der Meldung:
Im Projekt ... ist eine Exception der Klasse .... mit der Meldung 'access violation at ...: write of address .... ' aufgetreten.
Ist das mit dem with irgendwie nicht gut?
Ich habe das so gelernt und mache das immer so... o.O
Nersgatt - Do 10.04.14 07:57
Sowohl dm als auch ADOConnection1 sind korrekt instanziert worden?
Das With ist meiner Meinung nach einfach nur unübersichtlich. Daher benutze ich persönlich es grundsätzlich nicht.
WasWeißDennIch - Do 10.04.14 08:00
Was passiert denn, wenn Du in die "Open"-Zeile einen Haltepunkt setzt und mit F7 durchsteppst? Damit sollte sich zumindest ermitteln lassen, wo genau der Fehler auftritt.
jaenicke - Do 10.04.14 08:59
Wenn der Unterschied zwischen Komponente und selbst erzeugt ist, gibt es eigentlich nur zwei Unterschiede:
Erstens der Owner - vielleicht solltest du es einmal mit etwas anderem als nil probieren, z.B. deinem Formular testweise.
Zweitens ggf. gesetzte Eigenschaften im Objektinspektor, aber wenn du da keine gesetzt hast, sollte das nicht anders sein als manuell erzeugt.
Wie sieht der Stacktrace an der Stelle aus (in Delphi, wenn du bei der Exception auf anhalten gehst)? Und welche Adressen stehen denn in der Fehlermeldung?
Nersgatt hat folgendes geschrieben : |
Das With ist meiner Meinung nach einfach nur unübersichtlich. |
Und potentiell gefährlich.
Das ist als ob du einem Soldaten sagst "Alles was ich dir sage mach in die Richtung A" und dann den Schießbefehl erteilst. Schade nur, wenn dieser für eine nicht drehbare Kanone gilt, die z.B. in deine Richtung zeigt. Der Soldat mag das noch merken, der Compiler nicht.
Dhakiyah - Do 10.04.14 10:23
Also, wir haben jetzt viel rumprobiert.
Er scheint ein Problem mit der Übergabe von () haben.
Wenn ich z.B.
select * from tabelleX
mache, kommt kein Fehler, sobald ich aber z.B.
select min(spaltex) from tabelleY
oder eben das select sysdate() oder now() from dual
mache knallt er raus mit einer Zugriffsverletzung.
Kennt jemand das Problem?
jaenicke - Do 10.04.14 11:52
Was ist denn das für eine Datenbank dahinter?
Und welcher Provider wird in der Connection benutzt?
Muck - Do 10.04.14 14:43
Guten Morgen,
ich hatte vor Jahren gleiches Problem mit einer ADOQuery auf einer aelteren Version. Zugriffsverletzungen traten nicht mehr auf nach
Delphi-Quelltext
1: 2:
| LockType:=ltReadOnly; ParamCheck:=false; |
Vielleicht hilft es ja.
bye
Markus
Dhakiyah - Fr 11.04.14 06:28
Provider=MSDASQL.1
Datenbank=MySQL
@Markus
Delphi-Quelltext
1: 2:
| LockType:=ltReadOnly; ParamCheck:=false; |
Wo genau setze ich das ein?
EDIT:
Es schein mit dem LockType und dem ParamCheck zu funktionieren. :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!