![]() |
Re: MySQL ohne Komponenten
Hi,
das Tut ist wirklich spitze. Endlich DB-Anbindung ohne Komponenten ! :-D ![]() Very Happy Eine Frage habe ich natürlich trotzdem noch ... Wie gehe ich den am besten mit BLOBs um ? Danke schonmal im vorraus. |
Re: MySQL ohne Komponenten
Zitat:
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. |
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 ... |
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. |
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. |
Re: MySQL ohne Komponenten
Zeig mal ein bisschen Code.
|
Re: MySQL ohne Komponenten
kann ich die "mysql.pas" auch einfach mit der libmysql41.dll benutzen? (ist ja eigentlich für libmysql3x gemacht oder?)
|
Re: MySQL ohne Komponenten
teste es doch einfach!
kidix |
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: |
Re: MySQL ohne Komponenten
Wie finde ich eigentlich raus ob der mysql server mich trennt? es gibt ja gar keine events oder?
|
Re: MySQL ohne Komponenten
Zitat:
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 |
Re: MySQL ohne Komponenten
Hallo Wormid,
Klasse, lässt sich das auch auf Firebird übertragen? mfg BrunoT |
Re: MySQL ohne Komponenten
Zitat:
|
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) |
Re: MySQL ohne Komponenten
Wenn du pollen willst, ist mysql_ping vielleicht ganz interessant.
|
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:
Leider funktioniert die Funktion nur, wenn man verbunden ist, das macht das ganze aber nutzlos, da ich dann ja gar nicht abfragen brauch.
function TMySQL.Connected: Boolean;
begin Result := mysql_ping(FMySQL) = 0; end; Hast du da ne idee? |
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.
|
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? |
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; |
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:
Kann man auch unter diesen Link nachlesen :
mysql_free_result(_myRes);
_myRes:= nil; ![]() |
Re: MySQL ohne Komponenten
@Schuster: Bei dir geht es aber die Struktur MYSQL_RESULT, nicht um die Zugangskennung!
|
Re: MySQL ohne Komponenten
also ich habe ein problem
also ich speicher daten in eine Datenbank das mache ich so
Delphi-Quellcode:
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
query := PChar('UPDATE posts SET test = "' + cText + '" WHERE id = "' + cTableID + '"');
mysql_real_query(_myCon, query, Length(query)); wie mache ich das an besten ?? lg, Gigant |
Re: MySQL ohne Komponenten
Hai Gigant02,
gibt mysql_real_query nicht einen Integer mit der Menge der betroffenen Zeilen zurück? |
Re: MySQL ohne Komponenten
Zitat:
Nein, aber ![]() |
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:
|
Re: MySQL ohne Komponenten
Das sieht so aus, als würde die DLL (libmysql.dll) nicht gefunden. Ist diese vorhanden? Wenn ja, wo?
|
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:
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; |
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 |
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:
nacheinander werden aufgerufen getserverdata
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; und dann connect mit dem ergebniss von get serverdata leider bekomm ich immernoch bei der Zeile: _mycon := mysql_init(nil); Zitat:
|
Re: MySQL ohne Komponenten
host user und passwd sind ja immer noch PChars bei dir.
|
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; |
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 |
Re: MySQL ohne Komponenten
Hat sich seit meinem letzten Eintrag zu diesem Problem was getan ?
G Christian |
Re: MySQL ohne Komponenten
Ich habe gemäß dem Tut hier einen Button mit folgendem Inhalt erstellt:
Delphi-Quellcode:
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.
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; Kann mir wer sagen, was ich falsch mache? |
Re: MySQL ohne Komponenten
*nochmal hochschieb*
Da kann mir doch bestimmt wer helfen ;) |
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? |
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 ;) |
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 :) ) |
Re: MySQL ohne Komponenten
Wenn du Putty nicht mitliefern willst, musst du eben den SSH-Tunnel aus deinem Programm erzeugen.
Schau mal auf ![]() |
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 21:04 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