AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schwerer Fehler mit libmysql.dll
Thema durchsuchen
Ansicht
Themen-Optionen

Schwerer Fehler mit libmysql.dll

Ein Thema von malibubu · begonnen am 8. Okt 2004 · letzter Beitrag vom 10. Jun 2005
Antwort Antwort
malibubu

Registriert seit: 8. Okt 2004
4 Beiträge
 
#1

Schwerer Fehler mit libmysql.dll

  Alt 8. Okt 2004, 15:16
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.
  Mit Zitat antworten Zitat
malibubu

Registriert seit: 8. Okt 2004
4 Beiträge
 
#2

Re: Schwerer Fehler mit libmysql.dll

  Alt 8. Okt 2004, 15:25
posts := _mySubRow[1];

muss natürlich

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

Registriert seit: 8. Okt 2004
4 Beiträge
 
#3

Re: Schwerer Fehler mit libmysql.dll

  Alt 9. Okt 2004, 11:55
Kann mir keiner helfen????
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Schwerer Fehler mit libmysql.dll

  Alt 9. Okt 2004, 12:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#5

Re: Schwerer Fehler mit libmysql.dll

  Alt 9. Okt 2004, 12:37
Hi!

Dein MySQL-Query ist falsch. Es ergibt sich der folgende:
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
  Mit Zitat antworten Zitat
malibubu

Registriert seit: 8. Okt 2004
4 Beiträge
 
#6

Re: Schwerer Fehler mit libmysql.dll

  Alt 9. Okt 2004, 14:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#7

Re: Schwerer Fehler mit libmysql.dll

  Alt 9. Okt 2004, 19:00
Hi!

Probier mal als Query:

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 QuotedStr(const S: string): string;
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mamphil
Mamphil

Registriert seit: 17. Jul 2004
Ort: Garching b. München
149 Beiträge
 
Delphi 7 Professional
 
#8

Re: Schwerer Fehler mit libmysql.dll

  Alt 10. Jun 2005, 18:09
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
The laws of physics are the canvas God laid down on which to paint his masterpiece. “Leonardo Vetra” in Dan Brown’s “Angels & Demons”
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz