Delphi-PRAXiS
Seite 3 von 9     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Tutorials und Kurse (https://www.delphipraxis.net/36-tutorials-und-kurse/)
-   -   Delphi MySQL ohne Komponenten (https://www.delphipraxis.net/6543-mysql-ohne-komponenten.html)

DonaldDuck 10. Apr 2005 13:34

Re: MySQL ohne Komponenten
 
Hi,

das Tut ist wirklich spitze. Endlich DB-Anbindung ohne Komponenten ! :-D http://www.delphipraxis.net/posting.php?mode=iframe
Very Happy

Eine Frage habe ich natürlich trotzdem noch ...
Wie gehe ich den am besten mit BLOBs um ?

Danke schonmal im vorraus.

Chewie 10. Apr 2005 13:44

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von DonaldDuck
Eine Frage habe ich natürlich trotzdem noch ...
Wie gehe ich den am besten mit BLOBs um ?


Im Prinzip genauso wie mit anderen Datentypen. Bei binären Daten musst du halt unbedingt mysql_real_query mit der richtigen Längenangabe nehmen. Um die Daten in einen String zu kriegen, kannst du ja Memcopy oder Stream (in String kopieren) nehmen.

DonaldDuck 10. Apr 2005 19:02

Re: MySQL ohne Komponenten
 
Hi,

erstmal danke für die schnelle Antwort !

Ich hab' nun ziemlich rumprobiert mit den BLOBs, komme aber auf keinen grünen Zweig. :pale:

Mit Memcopy und Stream habe leider gar keine Erfahrung ...

Ich habe ich einem BLOB ein jpg hinterlegt und möchte es nun in einem TImage anzeigen lassen.
Beim Versuch die Angelieferten Daten in ein TJPEGImage umzuwandeln hängt sich Delphi mal gleich ganz auf... :cry:
Also mache ich wohl noch was falsch ...

Chewie 10. Apr 2005 19:07

Re: MySQL ohne Komponenten
 
Was du aus der Datenbank kriegst, ist ein Array of PChar, also nur ein zeiger auf die Daten, die dein Bild ausmachen. Diese musst du dann z.B. in dein JPEGImage kriegen. Hat das nicht ne Methode LoadFromStream oder so?
Wenn ja, dann kannst du deine Daten (mittels MemCopy) in den Stream kopieren, welchen du dann von deinem Image laden lässt.

DonaldDuck 10. Apr 2005 20:51

Re: MySQL ohne Komponenten
 
Hi nochmal,

jetzt hab ich es auch mit Streams versucht TStream und TMemoryStream, TBlobStream steht in der PE leider nicht zur Verfügung.

TJPEGImage kann man auch schön ein LoadFromStream machen, wenn ich dann aber versuche dem Image dieses JPEGImage zuzuweisen,
erhalte ich eine Exception.

Ich hab so gar keine Idee warum das nicht geht.

Zur Not arbeite ich mit Pfadangaben und lege die Bilder nicht in der DB ab. Wäre aber schade ...

Danke trotzdem für die so prompte Reaktion.

Chewie 10. Apr 2005 20:55

Re: MySQL ohne Komponenten
 
Zeig mal ein bisschen Code.

Pseudemys Nelsoni 11. Jun 2005 23:31

Re: MySQL ohne Komponenten
 
kann ich die "mysql.pas" auch einfach mit der libmysql41.dll benutzen? (ist ja eigentlich für libmysql3x gemacht oder?)

Kidix 11. Jun 2005 23:34

Re: MySQL ohne Komponenten
 
teste es doch einfach!

kidix

Pseudemys Nelsoni 11. Jun 2005 23:50

Re: MySQL ohne Komponenten
 
Naja, ich habe gedacht, das es schon jemand probiert hat und es mir aich so sagen würde ;)
Schliesslich arbeitet wohl noch kaum einer mit MySQL3 oder :wink:

Pseudemys Nelsoni 15. Jun 2005 23:07

Re: MySQL ohne Komponenten
 
Wie finde ich eigentlich raus ob der mysql server mich trennt? es gibt ja gar keine events oder?

DevilsCamp 16. Jun 2005 00:36

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von Pseudemys Nelsoni
Naja, ich habe gedacht, das es schon jemand probiert hat und es mir aich so sagen würde ;)
Schliesslich arbeitet wohl noch kaum einer mit MySQL3 oder :wink:

Ich nutze es mit MySQL 4.1.12.

Du darfst aber nicht die libmysql41.dll benutzen, sondern die libmysql.dll aus dem lib\opt Verzeichnis der Windows-Version von MySQL.
Dann ist es aber egal, ob du auf dem localhost oder auf irgendeinem Server im Netz connecten willst

BrunoT 16. Jun 2005 07:22

Re: MySQL ohne Komponenten
 
Hallo Wormid,

Klasse, lässt sich das auch auf Firebird übertragen?

mfg

BrunoT

Chewie 16. Jun 2005 17:19

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von Pseudemys Nelsoni
Wie finde ich eigentlich raus ob der mysql server mich trennt? es gibt ja gar keine events oder?

Du selbst kriegst keine Benachrichtigung. Also bleibt wohl nur Polling, oder du benachrichtigst den Benutzer erst darüber, wenn er es merkt - also üblicherweise bei einer fehhlgeschlagenen Anfrge.

Pseudemys Nelsoni 16. Jun 2005 17:23

Re: MySQL ohne Komponenten
 
jo, danke, werd ich dann wohl so machen (müssen).

Übrigens geht das ganze mit mysql4.1 (da ich das ja gefragt hatte)

Chewie 16. Jun 2005 17:27

Re: MySQL ohne Komponenten
 
Wenn du pollen willst, ist mysql_ping vielleicht ganz interessant.

Pseudemys Nelsoni 16. Jun 2005 17:35

Re: MySQL ohne Komponenten
 
Moin Chewie,

das wollte ich, das Problem dabei ist aber, das es eine AV gibt bei der benutzung von "mysql_ping" wenn man nicht verbunden ist.

Wie schon gepostet hatte ich das nämlich so versucht:

Delphi-Quellcode:
function TMySQL.Connected: Boolean;
begin
  Result := mysql_ping(FMySQL) = 0;
end;
Leider funktioniert die Funktion nur, wenn man verbunden ist, das macht das ganze aber nutzlos, da ich dann ja gar nicht abfragen brauch.

Hast du da ne idee?

Chewie 16. Jun 2005 17:43

Re: MySQL ohne Komponenten
 
Oh, hm, ich weiß auch nur das, was im MySQL-Handbuch steht. Abgesehen von dem Tipp, da drinen mal zu suchen (und auch die Kommentare zu lesen!), kann ich dir da nicht mehr weiterhelfen.

Pseudemys Nelsoni 17. Jun 2005 13:44

Re: MySQL ohne Komponenten
 
hmmm..

dann was anderes: Wenn man nicht verbunden ist mit dem mysql server, dann erzeugt JEDE mysql-funktionen eine AV....das ist doch nicht normal oder? normal sollte man ja einen fehler per mysql_error() kriegen und nicht AVs. Ich weiss bei so einer ja nicht was für ein Fehler überhaupt da is, weil da nur "at address 0x...." etc steht.

Hats du diesbezüglich eine idee?

Schuster 23. Jun 2005 13:48

Re: MySQL ohne Komponenten
 
ich habe das so gelöst um zu testen ob eine Verbindung besteht:

Delphi-Quellcode:
try
   begin
      if _MySql=nil then        //Wenn Objekt nicht vorhanden raus
      begin                     // ist notwendig da sonst Exception kommt
          result:=false;
          exit;
      end;
      if Verbindung=false then     //Globale Var die in Connect und disconect gesetzt wird
      begin                        // ist notwendig da sonst Exception kommt
          result:= false;
          exit;
      end;
      if _MySql<>nil then
      begin
        if mysql_ping(_MySql)=0 then
          result:= true
        else
          result:= false;
      end
      else
        result:=false;
   end;
   except
    result:=false;
   end;

Schuster 23. Jun 2005 15:39

Re: MySQL ohne Komponenten
 
Hab noch was gefunden was auch wichtig ist für diese Anleitung!!

mysql_free_result(_myRes); löscht zwar das Ergebnis wird aber nicht auf nil gesetzt

daher muß man noch _myRes auf nil setzten.

Delphi-Quellcode:
mysql_free_result(_myRes);
_myRes:= nil;
Kann man auch unter diesen Link nachlesen : Klick mich

Chewie 23. Jun 2005 17:04

Re: MySQL ohne Komponenten
 
@Schuster: Bei dir geht es aber die Struktur MYSQL_RESULT, nicht um die Zugangskennung!

Gigant02 27. Jul 2005 17:34

Re: MySQL ohne Komponenten
 
also ich habe ein problem

also ich speicher daten in eine Datenbank

das mache ich so

Delphi-Quellcode:
  query := PChar('UPDATE posts SET test = "' + cText + '" WHERE id = "' + cTableID + '"');
  mysql_real_query(_myCon, query, Length(query));
und nun will ich gerne wissen ob das auch geklappt hat weil es durchaus vorkommt das der server urplötzlich downgeht und zur sicherrung soll er dann halt mir nee nachricht geben wenn es nicht geklapt hat

wie mache ich das an besten ??

lg, Gigant

Sharky 27. Jul 2005 17:37

Re: MySQL ohne Komponenten
 
Hai Gigant02,

gibt mysql_real_query nicht einen Integer mit der Menge der betroffenen Zeilen zurück?

Chewie 27. Jul 2005 17:40

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von Sharky
Hai Gigant02,

gibt mysql_real_query nicht einen Integer mit der Menge der betroffenen Zeilen zurück?


Nein, aber mysql_affected_rows tut das.

citybreaker 3. Okt 2005 15:55

Re: MySQL ohne Komponenten
 
Hab das ganze auch mal Probiert, hänge aber schon beim Verbinden fest.
Habe das mit dem Verbinden auf einen Button gelegt.

Sobald ich auf den Button klicke, stürzt das Programm ab.

Zitat:

Im Projekt 'Projekt1.exe' ist eine Exception der Klasse EAccessViolation aufgetreten.
Meldung: 'Zugriffsverletzung bei Adresse 00000000'. Prozess wurde angehalten.
Weiter mit ...

Chewie 3. Okt 2005 16:44

Re: MySQL ohne Komponenten
 
Das sieht so aus, als würde die DLL (libmysql.dll) nicht gefunden. Ist diese vorhanden? Wenn ja, wo?

childen 4. Okt 2005 18:17

Re: MySQL ohne Komponenten
 
Vielen Dank für das Tut. Es hat mir sehr bei der Lösung einiger Probleme geholfen.

Allerdings hab ich noch folgendes Problem: Wenn ich die Serverdaten (host,user,passwd) nicht direkt vor dem verbinden setze, sondern aus textfeldern lade, erhalte ich wie mein Vorredner :
Zitat:

Im Projekt 'Projekt1.exe' ist eine Exception der Klasse EAccessViolation aufgetreten.
Meldung: 'Zugriffsverletzung bei Adresse 00000000'. Prozess wurde angehalten.
Weiter mit ...
wenn ich die Serverdaten direkt in die Variablen schreibe funktioniert der Code.

mein code zum einlesen:
Delphi-Quellcode:
var host,user,passwd:pchar;
begin
host := pchar(eing1.text);
user := pchar(eing2.text);
passwd := pchar(eing3.text);
end;

teebee 4. Okt 2005 18:45

Re: MySQL ohne Komponenten
 
Deklariere Deine Variablen mal als String und caste dann beim Connect zu PChar.
PChar reserviert von alleine keinen Speicher sondern ist nur ein Zeiger.

Gruß, teebee

childen 4. Okt 2005 19:10

Re: MySQL ohne Komponenten
 
Vielen Dank schon mal für die Idee allerdings hat es leider nicht ganz so funktioniert.

Hab jetzt folgendes:

Delphi-Quellcode:
type tserverdata = record
                      host:string;
                      user:string;
                      passwd:string;
                    end;

procedure connect(serverdata:tserverdata);
function getserverdata():tserverdata;

implementation

procedure connect(serverdata:tserverdata);
var _myCon: PMySQL;
    host,user,passwd,db:PChar;
begin
  host := pchar(serverdata.host);
  user := pchar(serverdata.user);
  passwd := pchar(serverdata.passwd);
  db := 'test1';
  _mycon := mysql_init(nil);
 
  if mysql_real_connect(_myCon, host, user, passwd, db, 3306, nil, 0) = nil then
  begin
    ShowMessage('Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
end;

function getserverdata():tserverdata;
begin
  result.host := edit1.text;
  result.user := edit2.text;
  result.passwd := edit3.text;
end;
nacheinander werden aufgerufen getserverdata
und dann connect mit dem ergebniss von get serverdata

leider bekomm ich immernoch bei der Zeile: _mycon := mysql_init(nil);

Zitat:

Im Projekt 'Projekt1.exe' ist eine Exception der Klasse EAccessViolation aufgetreten.
Meldung: 'Zugriffsverletzung bei Adresse 00000000'. Prozess wurde angehalten.
Weiter mit ...

Luckie 4. Okt 2005 19:14

Re: MySQL ohne Komponenten
 
host user und passwd sind ja immer noch PChars bei dir.

childen 4. Okt 2005 19:23

Re: MySQL ohne Komponenten
 
So, ich hab den Code jetzt noch mal einbisschen verändert, allerdings hat sich an dem Problem wie erwartet nichst geänder:

Delphi-Quellcode:
type tserverdata = record
                      host:string;
                      user:string;
                      passwd:string;
                    end;

procedure connect(serverdata:tserverdata);
function getserverdata():tserverdata;

implementation

procedure connect(serverdata:tserverdata);
var _myCon: PMySQL;
    host,user,passwd,db:string;
begin
  host := serverdata.host;
  user := serverdata.user;
  passwd := serverdata.passwd;
  db := 'test1';
  _mycon := mysql_init(nil); //<--- hier wird der Fehler ausgegeben
 
  if mysql_real_connect(_myCon, pchar(host), pchar(user), pchar(passwd), pchar(db), 3306, nil, 0) = nil then
  begin
    ShowMessage('Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
end;

function getserverdata():tserverdata;
begin
  result.host := edit1.text;
  result.user := edit2.text;
  result.passwd := edit3.text;
end;

childen 7. Okt 2005 12:02

Re: MySQL ohne Komponenten
 
Hat denn keiner noch eine Idee zu dem Probelm?

Sonst muss ich mich nach einer anderen Methode umgucken um mysql querys zu senden.
Was würdet ihr mir denn für Möglichkeiten empfehlen?

G Christian

childen 30. Dez 2005 02:56

Re: MySQL ohne Komponenten
 
Hat sich seit meinem letzten Eintrag zu diesem Problem was getan ?

G Christian

Stony2k 17. Jan 2006 14:33

Re: MySQL ohne Komponenten
 
Ich habe gemäß dem Tut hier einen Button mit folgendem Inhalt erstellt:

Delphi-Quellcode:
procedure Tfrm_main.SelectClick(Sender: TObject);
var
  Posts: TPostEntries;
  //idAuthor: String;  //zum Zwischenspeichern der Verfasser-ID
  query: PChar;
  _myCon: PMySQL;
  _myRes: PMySQL_Res; //hier wird der gesamte Ergebnissatz gespeichert
  //_mySubRes: PMySQL_Res; //benötigt, um Autor zu ermmitteln
  _myRow: PMySQL_Row; //enthält den aktuellen Datensatz
  //_mySubRow: PMySQL_Row; //benötigt, um Autor zu ermmitteln
  i: Integer;
begin
 
  {...}
  {Verbindung herstellen wie in Kap. 1 beschrieben}
 
  query := 'SELECT * FROM pw_change ORDER BY account';
  mysql_real_query(_myCon, query, Length(query));
 
  _myRes := mysql_store_result(_myCon); //alle Datensätze vom Server anfordern
  if _myRes = nil then
  begin
    ShowMessage('Es konnten keine Datensätze zurückgebenen werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
 
  SetLength(Posts, mysql_num_rows(_myRes)); //Posts-Array-Größe auf Anzahl der Datensätze setzen

  for i := 0 to High(Posts) do
  begin
    _myRow := mysql_fetch_row(_myRes);  //Datensatz abholen
    Posts[i].account := _myRow[0]; //ID des Posts ist erstes Feld im Datensatz
    Posts[i].passwort := _myRow[1];         //Zeitpunkt ist drittes Feld

    {query := PChar('SELECT name FROM users WHERE id=' + idAuthor);
    _mySubRes := mysql_store_result(_myCon);
    _mySubRow := mysql_fetch_row(_mySubRes);
    Posts[i].author := _mySubRow[0];

    mysql_free_result(_mySubRes);       //Ergebnissatz löschen }
  end;

  mysql_free_result(_myRes);            //Ergebnissätze löschen

  {...}
  {Verbindung schließen oder etwas anderes machen}
end;
Ich verbinde erst zur DB mit den Codezielen aus diesem Tut. Nachdem Showmessage mir sagt, ich habe erfolgreich verbunden, drücke ich den Button.. und dann friert das Programm ein.

Kann mir wer sagen, was ich falsch mache?

Stony2k 18. Jan 2006 05:22

Re: MySQL ohne Komponenten
 
*nochmal hochschieb*

Da kann mir doch bestimmt wer helfen ;)

Tyler 28. Jan 2006 10:21

Re: MySQL ohne Komponenten
 
Wie bekomme ich nun in diese Routine, die grundsätzlich erstmal 1a funktioniert, eine Verbindung über einen SSH Tunnel hin?

Hintergrund: Viele Provider, bzw. die meisten, verbieten grundsätzlich aus Sicherheitsgründen den Zugriff auf ihre MySQL-Server von Clients, die nicht "localhost" von localhost kommen. Somit hab ich mit einem Delphi-Client hier zuhause ja ein Problem.
Entweder ich greife über HTTP und PHP auf den Server zu, was aber auch ne Menge Arbeit ist, oder ich nutze SSH und bastel mir ein Tunnel, und klopfe direkt als "localhost" am Server an.


Jemand ne Idee, ne zündende?

Chewie 28. Jan 2006 11:00

Re: MySQL ohne Komponenten
 
Grundsätzlich sollte dieser SSH-Tunnel doch transparent sein, oder?
Du trägst also den lokalen Endpunkt des Tunnels als MySQL-Server ein.

Theoretisch zumindest ;)

Tyler 28. Jan 2006 11:07

Re: MySQL ohne Komponenten
 
Jau, das funktioniert. Aber dann müsste ich Putty ja noch extra als Programm mitliefern und von meinem DelphiTool aus die Exe entsprechend starten. Schöner wärs ja, wenn das mein Programm selber könnte :)

(Grundsätzlich ist das natürlich ne Lösung, richtig :) )

Chewie 28. Jan 2006 11:46

Re: MySQL ohne Komponenten
 
Wenn du Putty nicht mitliefern willst, musst du eben den SSH-Tunnel aus deinem Programm erzeugen.
Schau mal auf http://www.torry.net/ nach, vielleicht gibts dort entsprechende Konmponenten.

Troka 30. Jan 2006 12:52

Re: MySQL ohne Komponenten
 
Ich bekomme beim Auslesen der Daten folgenden Fehler:
'Access violation at adress 00BB357A in module 'libmysql.dll'. Read of address 00000388'

Delphi-Quellcode:
procedure TForm1.listboxfill;
var
  Posts: TPostEntries;
  query: PChar;
  _myCon: PMySQL;
  _myRes: PMySQL_Res; //hier wird der gesamte Ergebnissatz gespeichert
  _myRow: PMySQL_Row; //enthält den aktuellen Datensatz
  i: Integer;
begin
  {Verbindung herstellen}
  query := 'SELECT * FROM link ORDER BY id';
  _myCon:=PMySQL('0'); //Damit Variable initalisiert wird
  mysql_real_query(_myCon, query, Length(query));
  _myRes := mysql_store_result(_myCon); //alle Datensätze vom Server anfordern
  if _myRes = nil then
  begin
    ShowMessage('Es konnten keine Datensätze zurückgebenen werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
  SetLength(Posts, mysql_num_rows(_myRes)); //Posts-Array-Größe auf Anzahl der Datensätze setzen
    for i := 0 to High(Posts) do
  begin
    _myRow := mysql_fetch_row(_myRes);  //Datensatz abholen
    Posts[i].link := _myRow[0]; //Link ist erstes Feld im Datensatz
    Posts[i].nummer := StrToInt(_myRow[1]);         //ID ist das zweite Feld
    Posts[i].name := _myRow[2];
    listbox1.Items.Add(Posts[i].name);
  end;

  mysql_free_result(_myRes);            //Ergebnissätze löschen
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 3 von 9     123 45     Letzte »    

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