Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schwerer Fehler mit libmysql.dll (https://www.delphipraxis.net/31401-schwerer-fehler-mit-libmysql-dll.html)

malibubu 8. Okt 2004 15:16


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:
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.
So, lasse ich das Programm so laufen, bekomme ich gleich folgende Fehlermeldung:
"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:
   if _mySubRes = nil then
     begin
      ShowMessage('Nicht gefunden');
      mysql_close(_myCon);
      Exit;
     end;
Dann macht es keine Probleme, also scheint es wohl an _mySubRow := mysql_fetch_row(_mySubRes); zu liegen.

Das Lustige ist, dass der Datensatz mit 1er Stelle "test" jedoch besteht...

Hat jemand eine Lösung? Danke im Voraus.

malibubu 8. Okt 2004 15:25

Re: Schwerer Fehler mit libmysql.dll
 
posts := _mySubRow[1];

muss natürlich

posts := _mySubRow[0];
sein, dass problem besteht jedoch weiterhin.

malibubu 9. Okt 2004 11:55

Re: Schwerer Fehler mit libmysql.dll
 
Kann mir keiner helfen????

Jelly 9. Okt 2004 12:02

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

Mamphil 9. Okt 2004 12:37

Re: Schwerer Fehler mit libmysql.dll
 
Hi!

Dein MySQL-Query ist falsch. Es ergibt sich der folgende:
SQL-Code:
SELECT name FROM users WHERE name=test
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.

Es gibt also gar kein gültiges MySQL-Ergebnis und es kann auch keine Ergebniszeile ermittelt werden...

Mamphil

malibubu 9. Okt 2004 14:55

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.

Mamphil 9. Okt 2004 19:00

Re: Schwerer Fehler mit libmysql.dll
 
Hi!

Probier mal als Query:

SQL-Code:
SELECT name FROM users
- ganz ohne WHERE-Statement.

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:

Zitat von Delphi-Hilfe
Mit QuotedStr kann der String S in einen String in Anführungszeichen umgewandelt werden. Am Anfang und am Ende von S wird ein halbes Anführungszeichen (') hinzugefügt. Wenn innerhalb des Strings halbe Anführungszeichen enthalten sind, werden diese verdoppelt.

Alles klar?

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.

Mamphil 10. Jun 2005 18:09

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:
posts := _mySubRow[1];
mysql_free_result(_mySubRes);
Label1.Caption := posts;
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.

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