Entwickler-Ecke

Datenbanken - [dbexpress] Zugriffsverletzung bei query


l33t - Sa 17.01.09 19:18
Titel: [dbexpress] Zugriffsverletzung bei query
Hallo,
wenn ich das unten aufgefuehrte stueck code ausfuehre, dann erhalte ich eine Zugriffsverletzung im Modul 'dbxmys.dll'. Hat jemand eine Idee?

Der SQL server sowie die libmysqld.dll sind selbstverstaendlcih passend.
Mysql version ist 5.0.26. Zu beachten ist jedoch das wenn cih auf einen anderen Server zugreife das selbe passiert.

Die Verbindung kann ich jedoch aufbauen



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button4Click(Sender: TObject);
begin
if sqlconnection1.connected then  begin
sqlquery1.SQL.Clear;
sqlquery1.SQL.Add('SELECT * from l2j.characters;');
sqlquery1.open;
sqlquery1.First;
while not sqlquery1.eof do
  begin
    a := SQLQuery1.FieldByName('char_name').asstring;
    showmessage(a);
    sqlquery1.Next;
  end;

end;
end;


Danke im Vorraus


jaenicke - Sa 17.01.09 19:27

In welcher Zeile kommt die Zugriffsverletzung und bei welcher Adresse (0 oder eine andere vor allem)?


l33t - Sa 17.01.09 19:44

Der genaue Fehler ist:
Zugriffsverletzung bei Adresse 00238564 in Modul 'dbxmys.dll' Lesen von Adresse 00000000

Die Zeile weiss ich leider nicht... Vermute aber die Zeile "sqlquery1.open". Der Debugger faengt den Fehler aus irgendeinem Grund nicht ab


Delete - Sa 17.01.09 19:47

Und so?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button4Click(Sender: TObject);
begin
  if sqlconnection1.connected then begin
    sqlquery1.Close;
    sqlquery1.SQL.Text := 'SELECT * from l2j.characters;';
    sqlquery1.open;
    while not sqlquery1.eof do
      begin
        a := SQLQuery1.FieldByName('char_name').asstring;
        showmessage(a);
        sqlquery1.Next;
      end;
  end;
end;

DBExpress ist allerdings nicht mein Spezialgebiet.


l33t - Sa 17.01.09 19:51

leider genau das selbe...


Delete - Sa 17.01.09 19:54

Stepp mal mit F7 durch, das muss doch gehen.


l33t - Sa 17.01.09 21:12

hab ich versucht dann geht der aber alle units durch das sind ja ueber 100k zeilen.


jaenicke - Sa 17.01.09 21:27

Du musst natürlich erst einen Haltepunkt auf den Anfang der Prozedur setzen...
Wenn dann das Programm dort ankommt, kannst du mit F8 zeilenweise den Quelltext abarbeiten lassen.


l33t - So 18.01.09 16:31

ja klar hab ich ja auch so gemacht nur dann geht der von jeder verwendeten dbexpress funktion alle zeilen durch


jaenicke - So 18.01.09 16:34

Das dürfte eigentlich (vor dem Fehler) nur bei F7 passieren. :gruebel:
F8 springt eigentlich nicht in die Befehle hinein.


Delete - So 18.01.09 16:58

Nochmal:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button4Click(Sender: TObject);
begin
  if sqlconnection1.connected then begin //hier Breakpoint setzen und dann (zunächst) mit F8 durchsteppen
    sqlquery1.Close; 
    sqlquery1.SQL.Text := 'SELECT * from l2j.characters;';
    sqlquery1.open;
    while not sqlquery1.eof do
      begin
        a := SQLQuery1.FieldByName('char_name').asstring;
        showmessage(a);
        sqlquery1.Next;
      end;
  end;
end;


SparrowSX - Sa 07.02.09 18:46

Der Fehler kommt bei (bzw. in)

Delphi-Quelltext
1:
sqlquery1.open;                    


Ich hab den gleichen Fehler... wäre schön wenn sich doch noch jemand mit ner Lösung findet...

PS: bei mir is die Zugriffsverletzung bei Adresse: 03398564


SparrowSX - So 08.02.09 16:42

Also der Fehler liegt in der 'dbxmys.dll'
...
Nach einigem suchen musste ich feststellen dass diese Datei, MySQL nur bis Version 5.0.x unterstützt...

Habe gerade eine Version für 5.1 gefunden (http://cc.codegear.com/Item/24598)...

Eben installiert aber keine Änderung (wird in einem seperaten Ordner installiert und geht nur bis Delphi 11)


Also ich nehme mal an dass ich nur einen Treiber (also eine aktuelle dbxmys.dll) für Delphi 2009 mit MySQL 5.1 Unterstützung brauche.

Nochmal zu den Fehlern:
Verbinden geht... auch wenige Abfragebefehle mit sqlquerry ('show tables;') funktionieren.
Aber sobald ich z.B. eine Tabelle erstellen will oder Daten einfügen schreibt er entweder 'Falscher SQL-Syntax ...' oder 'Zugriffsverletzung ...'


jaenicke - So 08.02.09 17:05

user profile iconSparrowSX hat folgendes geschrieben Zum zitierten Posting springen:
Aber sobald ich z.B. eine Tabelle erstellen will oder Daten einfügen schreibt er entweder 'Falscher SQL-Syntax ...'
Steht da vielleicht auch eine genauere Meldung? Es wäre interessant, wenn da der Befehl stünde wie er angekommen ist.

Ich vermute der Fehler liegt an der Unicodeunterstützung in Delphi 2009 und ggf. einer fehlerhaften Umwandlung / Übergabe der Strings.


SparrowSX - So 08.02.09 18:20

Habe MySQL-Server auf Version 5.0.67 neu installiert...
Bei MySQL-Client Version steht da aber immernoch 5.1.3

Könnte das jetzt noch der Fehler sein? (oder is das nur auf phpmyadmin bezogen?) - Wenn ja - wie bekomme ich die Clientversion runter?

Unicodeunterstützung? ... mit sowas hab ich mich noch gar nich auseinandergesetzt... aber wenn Delphi 2009 mit dbexpress ausgeliefert wir müsste das doch eigentlich funktionieren oder nich?

Unter Details bei der Zugriffsverletzung steht:

[11EE8564]{dbxmys.dll } Unbekannte Funktion bei DBXReader_Next + $16100
[501D720C]{vcl120.bpl } Controls.TWinControl.WMNCHitTest (Line 10593, "Controls.pas" + 5) + $4
[501D0BFA]{vcl120.bpl } Controls.TControl.WndProc (Line 6640, "Controls.pas" + 91) + $6
[0ED25774]{DbxCommonDriver120.bpl} Dbxdynalink.TDBXDynalinkCommand.DerivedPrepare + $19C
[0ED25789]{DbxCommonDriver120.bpl} Dbxdynalink.TDBXDynalinkCommand.DerivedPrepare + $1B1
[0ED253C5]{DbxCommonDriver120.bpl} Dbxdynalink.TDBXDynalinkCommand.DerivedExecuteQuery + $81
[0ED09C05]{DbxCommonDriver120.bpl} Dbxcommon.TDBXCommand.ExecuteQuery + $45
[0ED0A083]{DbxCommonDriver120.bpl} Dbxcommon.TDBXMorphicCommand.ExecuteQuery + $F
[50AC096F]{dbexpress120.bpl} SqlExpr.TCustomSQLDataSet.ExecuteStatement (Line 5803, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 43) + $B
[50ABCABC]{dbexpress120.bpl} SqlExpr.TCustomSQLDataSet.InternalOpen (Line 4110, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 1) + $2
[504941B9]{dbrtl120.bpl} DB.TDataSet.DoInternalOpen (Line 10599, "DB.pas" + 2) + $4
[50494272]{dbrtl120.bpl} DB.TDataSet.OpenCursor (Line 10628, "DB.pas" + 4) + $2
[50ABCBF3]{dbexpress120.bpl} SqlExpr.TCustomSQLDataSet.OpenCursor (Line 4142, "..\..\..\..\..\src\pas\dbx\vcl\SqlExpr.pas" + 10) + $4
[5049412D]{dbrtl120.bpl} DB.TDataSet.SetActive (Line 10581, "DB.pas" + 12) + $7
[5003EA46]{rtl120.bpl } TypInfo.SetOrdProp (Line 1502, "TypInfo.pas" + 27) + $0
[20B9ACF2]{designide120.bpl} DesignEditors.TPropertyEditor.SetOrdValue (Line 838, "DesignEditors.pas" + 2) + $E
[20B9BDFB]{designide120.bpl} DesignEditors.TEnumProperty.SetValue (Line 1398, "DesignEditors.pas" + 5) + $4
[20B9A961]{designide120.bpl} DesignEditors.TPropertyEditor.Edit (Line 668, "DesignEditors.pas" + 11) + $14
[208AAF82]{coreide120.bpl} PropInsp.TPropertyInspector.PropListEditDblClick (Line 882, "PropInsp.pas" + 20) + $5
[20C87371]{vclide120.bpl} IDEInspListBox.TInspListBox.DoEditDblClick (Line 976, "IDEInspListBox.pas" + 2) + $A
[20C88BB2]{vclide120.bpl} IDEInspListBox.TInspListBox.EditDblClick (Line 1546, "IDEInspListBox.pas" + 0) + $2
[501D1181]{vcl120.bpl } Controls.TControl.DblClick (Line 6761, "Controls.pas" + 1) + $14
[501D12E4]{vcl120.bpl } Controls.TControl.WMLButtonDblClk (Line 6804, "Controls.pas" + 4) + $C
[501D0BFA]{vcl120.bpl } Controls.TControl.WndProc (Line 6640, "Controls.pas" + 91) + $6
[50057E04]{rtl120.bpl } Classes.StdWndProc (Line 12723, "Classes.pas" + 8) + $0
[501D5287]{vcl120.bpl } Controls.TWinControl.WndProc (Line 9334, "Controls.pas" + 136) + $6
[501DD246]{vcl120.bpl } Controls.TDockTree.WndProc (Line 14467, "Controls.pas" + 74) + $5
[50046C98]{rtl120.bpl } Classes.TThreadList.UnlockList (Line 3781, "Classes.pas" + 0) + $4
[5012C8FC]{vcl120.bpl } Graphics.FreeMemoryContexts (Line 6830, "Graphics.pas" + 12) + $5
[501D4BE0]{vcl120.bpl } Controls.TWinControl.IsControlMouseMsg (Line 9127, "Controls.pas" + 9) + $25
[501D5287]{vcl120.bpl } Controls.TWinControl.WndProc (Line 9334, "Controls.pas" + 136) + $6
[20C86513]{vclide120.bpl} IDEInspListBox.TPropInspEdit.WndProc (Line 439, "IDEInspListBox.pas" + 7) + $4
[501D49A0]{vcl120.bpl } Controls.TWinControl.MainWndProc (Line 9063, "Controls.pas" + 3) + $6
[50057E04]{rtl120.bpl } Classes.StdWndProc (Line 12723, "Classes.pas" + 8) + $0
[501FB041]{vcl120.bpl } Forms.TApplication.StopHintTimer (Line 10343, "Forms.pas" + 3) + $6
[501F9EAB]{vcl120.bpl } Forms.TApplication.ProcessMessage (Line 9613, "Forms.pas" + 23) + $1
[501F9EEE]{vcl120.bpl } Forms.TApplication.HandleMessage (Line 9643, "Forms.pas" + 1) + $4
[501FA219]{vcl120.bpl } Forms.TApplication.Run (Line 9780, "Forms.pas" + 26) + $3
[004259D2]{bds.exe } bds.bds (Line 196, "" + 7) + $7


SparrowSX - So 08.02.09 19:01

Also ich weiß nich wie... aber eben hats geklappt... :?

Das Problem das ich demnächst haben werde: Ich muss das noch auf meinem Laptop zum laufen bekommen... :(

Ich muss aber mal anmerken:
Ich habe unzählige dlls, updates und "lösungen" von drittanbietern (devart uvm.) installiert, integriert usw.

Habe bis jetzt auch nur 2 Befehle die ohne Fehler funktionieren... werde weitere testen (falls doch nicht alles geht melde ich mich garantiert nochmal) :lol:



Und wenn ich es auf meinem Laptop zum laufen bekomme und der Fehler bzw. die Lösung eindeutig sind werd ich es natürlich sofort posten. :wink: