![]() |
Schwerer Fehler mit libmysql.dll
Hallo zusammen,
ich habe mir ein kleiner Programm geschrieben, mit dem ich von einen MySQL-Server einen Datensatz auslesen möchte. Dazu benutze ich die wohl bekannte "mysql.pas". Die "libmysql.dll" ist auch Im System32-Verzeichnis. Hier erstmal der Quellcode um zu vermeiden, dass ich einen Programmierfehler gemacht habe:
Delphi-Quellcode:
So, lasse ich das Programm so laufen, bekomme ich gleich folgende Fehlermeldung:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, mySQL, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var _myCon: PMySQL; host, user, pass, db: PChar; _mySubRes: PMySQL_Res; _mySubRow: PMySQL_Row; posts, userna: string; query: PChar; begin host := 'MEIN_SERVER'; user := 'DATENBANK'; pass := 'PASSWORT'; db := 'ftpserver'; userna := 'test'; _myCon := mysql_init(nil); if _myCon = nil then begin ShowMessage('Fehler beim Verbindungsaufbau.'); mysql_close(_myCon); Exit; end; if mysql_real_connect(_myCon, host, user, pass, db, 3306, nil, 0) = nil then begin ShowMessage('Fehler beim Verbindungsaufbau.'); mysql_close(_myCon); Exit; end; mysql_select_db(_myCon, db); query := PChar('SELECT name FROM users WHERE name=' + userna); mysql_real_query(_myCon, query, Length(query)); _mySubRes := mysql_store_result(_myCon); _mySubRow := mysql_fetch_row(_mySubRes); posts := _mySubRow[1]; mysql_free_result(_mySubRes); Label1.Caption := posts; mysql_close(_myCon); end; end. "Im Prejekt Projekt1 ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 10006C36 in Modul 'libmysql.dll''. Lesen von Adresse 00000014. Prozess wurde Angehalten...." Um zu schauen, wo der Fehler liegt, habe ich noch folgenden Code eingesetzt (vor _mySubRow := mysql_fetch_row(_mySubRes); ) :
Delphi-Quellcode:
Dann macht es keine Probleme, also scheint es wohl an _mySubRow := mysql_fetch_row(_mySubRes); zu liegen.
if _mySubRes = nil then
begin ShowMessage('Nicht gefunden'); mysql_close(_myCon); Exit; end; Das Lustige ist, dass der Datensatz mit 1er Stelle "test" jedoch besteht... Hat jemand eine Lösung? Danke im Voraus. |
Re: Schwerer Fehler mit libmysql.dll
posts := _mySubRow[1];
muss natürlich posts := _mySubRow[0]; sein, dass problem besteht jedoch weiterhin. |
Re: Schwerer Fehler mit libmysql.dll
Kann mir keiner helfen????
|
Re: Schwerer Fehler mit libmysql.dll
Hallo,
hast du eventuell eine falsche libmysql.dll Version, die nicht zu deinem Server passt. Das Problem hatte ich mal in Verbindung mit der Zeos-Komponenten der version 4.x |
Re: Schwerer Fehler mit libmysql.dll
Hi!
Dein MySQL-Query ist falsch. Es ergibt sich der folgende:
SQL-Code:
Das heißt, es wird das Ergebnis gesucht, in dem der Inhalt der Spalte name mit dem Inhalt der Spalte test übereinstimmt. Vermutlich willst du aber gucken, wo in der Spalte name 'test' steht. Du musst daher 'test' quoten.
SELECT name FROM users WHERE name=test
Es gibt also gar kein gültiges MySQL-Ergebnis und es kann auch keine Ergebniszeile ermittelt werden... Mamphil |
Re: Schwerer Fehler mit libmysql.dll
Also,
select * from users where name=....... funktioniert auch nicht. Select name from users where name=... bedeutet: Wähle spalte "name" wo name=.... Genau dass ist auch richtig so,... ich probier es mal mit einer anderen libmysql.dll... Danke im Voraus. |
Re: Schwerer Fehler mit libmysql.dll
Hi!
Probier mal als Query:
SQL-Code:
- ganz ohne WHERE-Statement.
SELECT name FROM users
Wenn du im WHERE-Statement einen Vergleich mit einem String machen willst, musst du diesen String in Anführungszeichen packen (=quoten)! Du erreichst dieses über die Funktion
Delphi-Quellcode:
QuotedStr(const S: string): string;
Zitat:
Mamphil EDIT: Ansonsten würde ich einfach mal mysql_error(_dbcon); ausgeben lassen. Vielleicht klärt sich dadurch ein eventuell vorhandener Fehler im MySQL-Statement auf. |
Re: Schwerer Fehler mit libmysql.dll
Hallo!
Ich bin mir inzwischen ziemlich sicher, wo der Fehler liegt, denn ich bin heute über genau das selbe Phänomen gestolpert:
Delphi-Quellcode:
Zuerst weist du dem String posts einen Wert des Pointers _mySubRow zu. Dann zerstörst du diesen Pointer per mysql_free_result. Und anschließend versuchst du wieder (über den Umweg der Variable posts) auf diesen Pointer zu zu greifen. Und genau das klappt vermutlich nicht.
posts := _mySubRow[1];
mysql_free_result(_mySubRes); Label1.Caption := posts; Wenn du das mysql_free_result ans Ende stellst, funktioniert das ganze vermutlich - das war zumindest die Lösung bei meinem prinzipiell ähnlichen Problem. Mamphil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz