Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zugriff auf MySQL (https://www.delphipraxis.net/153199-zugriff-auf-mysql.html)

idefix2 24. Jul 2010 13:49

Datenbank: MySQL • Version: 5.1 • Zugriff über: API

Zugriff auf MySQL
 
In der DP gibt es ein älteres Tutorial von Chewie für den direkten Zugriff auf MySQL ohne Komponenten: http://www.delphipraxis.net/6543-mys...mponenten.html.

Der erste Link in dem Tutorial, von dem man die Pascal-Übersetzungen der MySQL C-Header herunterladen sollte, funktioniert leider nicht mehr.

Kann mir jemand sagen, ob diese Delphi Datei noch irgendwo verfügbar ist (oder eine andere Alternative)?

Matze 24. Jul 2010 13:52

AW: Zugriff auf MySQL
 
Evtl. ist es diese Datei (der durchgestrichene Link im Tutorial): http://www.audio-data.de/mysql.html
Die ist auch für Delphi 2010. Das Projekt scheint also noch gepflegt zu werden.

Wenn es die Datei ist, sag's mir bitte. Dann editiere ich den Link im Tutorial.

idefix2 24. Jul 2010 14:12

AW: Zugriff auf MySQL
 
Jaaaa, der Link ist es.

Danke.

Matze 24. Jul 2010 14:25

AW: Zugriff auf MySQL
 
Danke für deine Rückmeldung. Ich habe den Link angepasst.

Schorschi5566 2. Aug 2010 23:47

AW: Zugriff auf MySQL
 
Hallo Matthias,

Zitat:

Das Projekt scheint also noch gepflegt zu werden.
Na ja, oder so ähnlich. :-D

Delphi-Quellcode:
  function mysql_ssl_set(_mysql: PMYSQL; key, cert, ca, capath: PAnsiChar): longint; stdcall;


Die obige Deklaration ist jedenfalls genauso falsch, wie in der Version, die ich habe.

Da fehlt der Cipher. So ist's richtig:

Delphi-Quellcode:
  function mysql_ssl_set(_mysql: PMYSQL; key, cert, ca, capath, cipher: PAnsiChar): longint; stdcall;



Grüße,
Uwe

himitsu 3. Aug 2010 07:37

AW: Zugriff auf MySQL
 
Meine Deklaration/Header sind korrekt. (jedenfalls solange verwendeten die Dekumentationen von mysql.com diesbezüglich stimmen)

Nja, hab noch nicht alles verglichen, aber irgendwo gab es auch noch eine Differenz.

Was an dieser Datei aber "gut" ist, daß sie sich versucht an die Lib/DLL anzupassen ... meine Datei(en) ist/sind "fest" auf eine Lib/DLL-Version eingestellt (was ich aber nicht sooo als großen Nachteil seh, denn wenn man für MySQL 5.5 programmiert, wäre es eh nicht so gut, wenn man dann einfach eine 4.0er DLL unterschieben könnte, oder? ).

Schorschi5566 3. Aug 2010 07:51

AW: Zugriff auf MySQL
 
Hallo Himitsu,

Zitat:

Zitat von Himitsu
wäre es eh nicht so gut, wenn man dann einfach eine 4.0er DLL unterschieben könnte, oder?

Jedenfalls nicht, wenn's dann knallt. :-D

Ich finde die mysql.pas auch nicht schlecht aber der Zugriff war by DirectSQL "schöner". Zwei Klassen (TMySQLResult und TMySQLClient) und fertig. Ich habe mir dafür so eine Art Wrapper gebastelt, der den Zugriff wie bei DirectSQL macht aber mysql.pas nutzt.


Grüße,
Uwe

himitsu 3. Aug 2010 08:15

AW: Zugriff auf MySQL
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1039156)
Jedenfalls nicht, wenn's dann knallt. :-D

Wenn dein Programm für 5.0 geschrieben ist (also Queries/Statements dafür verwendet, dann knallt es auch, wenn man ihm eine 4.1-DLL unterschiebt :zwinker:
Die Server sind hoffentlich abwärts kompatibel, so daß man falls dein Programm für 4.1 erstellt wurde dennoch mit einer 4.1-DLL (Client) auf 'nen 5.5er Server zugreifen kann, anstatt deinem Programm auch noch einen 5.5er Clienten unterzuschieben und zu hoffen, daß dieser auch läuft. PS: einige APIs wurden ja geändert und selbst wenn sich diese Unit anpaßt ... sie kennt nur das was sie kennt und es ist somit (aktuell) eh nicht möglich ihr z.B. 'nen 6.0-Clienten unterzuschieben.

Man muß also bei beiden Libs einen passenden Clienten verwenden (nur daß bei mir halt Weniger, bzw. nur Ausgewähltere passen)

Delphi-Quellcode:
TMySQLx      = ...;
TMySQL       = ^RMySQL;
TMyResult    = ^RMyResult;
TMyField     = ^RMyField;
TMyRow       = ^RMyRow;
TMyRows      = ^RMyRows;
TMyStatement = ^RMyStatement;
TMyBinding   = ^RMyBinding;
TMyBindBuffer = ^RMyBindBuffer;
Nur 2 "Klassen" gingen bei mir nicht, da ich die Funktionen direkt in die, von ihnen für den Zugriff genutzten, Record integriert hab.

Delphi-Quellcode:
// statt
function mysql_ssl_set(_mysql: PMYSQL; key, cert, ca, capath, cipher: PAnsiChar): longint; stdcall;
                    // ^^^^^^^^^^^^^^^

type
  // so
  TMySQL = ^RMySQL;
  RMySQL = record
    function mysql_ssl_set(key, cert, ca, capath, cipher: PAnsiChar): longint; stdcall;
  end

  // wobei eigentlich ja so
  RMySQL = record
    function mysql_ssl_set(key, cert, ca, capath, cipher: AnsiString): longint; stdcall;
  end;
Txxx ist also eigentlich ein Pxxx und das Rxxx ein Txxx
weiß noch nicht, ob ich das wieder ändere, aber ich dachte mir, daß Txxx (statt Pxxx) mehr an eine Klasse erinnert.
Aber da ich eh noch nicht weiß, was ich mit der Klasse TMySQLx (die statischen Funktionen, welche mal in RMySQL drin waren) mach, könnte es wohl doch so sein, daß ich es noch tausche und die statischen Funktionen wieder in den anderen Record verschiebe. :gruebel:



In deinem Fall sind also auch nur TMySQL, TMyResult und TMyRow, welche du benötigst,
bzw. zusätzlich noch TMyStatement und TMyBinding für die prepared Statements.

Schorschi5566 3. Aug 2010 08:43

AW: Zugriff auf MySQL
 
Hallo Himitsu,

kann gut sein, dass mein Wrapper nicht gerade vollständig ist.

In 95% aller Fälle brauche ich sowas:

Delphi-Quellcode:
unit Unit1;

interface

uses
  MySQL;

implementation

procedure Test;
var
  bEx, bUseSSL: Boolean;
  sqlClient : TMySQLClient;
  sqlResult : TMySQLResult;
  sName : String;
  iPort, iNumber : Integer;

begin
  sqlClient := TMysqlClient.Create;
  iPort := 3306;
  bUseSSL := True;
  bEx := sqlClient.connect_db('DB', 'User', 'Passwort', 'Host', iPort, bUseSSL);
  if bEx then
  begin
    sqlResult := sqlClient.query('SELECT * FROM TEST WHERE X > 5', True, bEx);
    if bEx then
    begin
      with sqlResult do
      begin
        First;
        while not Eof do
        begin
          sName := FieldByName('Name').AsString;
          iNumber := FieldByName('Number').AsInteger;
          Next;
        end;
        Free;
      end;
    end;
    sqlClient.disconnect_db;
    sqlClient.Free;
  end;
end;

end.
Das funktioniert soweit und ich muss mich nicht weiter um das ganze "Außenrum" der mysql.pas kümmern. ;)

TMyRow brauche ich nur intern. Nach "außen" sind es wirklich nur 2 Klassen.

Mit FieldByIndex, FieldByName, FieldValueByName konnte ich bisher alle Fälle abdecken.

Mit TMyBinding und TMyStatement habe ich bis jetzt noch nichts gemacht. Wozu ist das? Stored Procedures?


Grüße,
Uwe

himitsu 3. Aug 2010 09:10

AW: Zugriff auf MySQL
 
drum hatte ich auch mal angefangen zu schauen, was bei dir noch fehlt/falsch ist, aber erstmal wollte ich das Problem finden, warum "beide" Codes nicht immer funktionieren (siehe der "Fehler" am Ende deines Threads).

Im Prinzip ist mein Code nur eine direkte Protierung der Header
(drum ist die MySQLHeader.pas auch nicht großartig aufgeräumt, um die nächsten Änderungen besser erkennen und einpflegen zu können)
und deines quasi schon eine kleine "Komponente" :stupid:, für einen komfortableren Zugriff.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr.
Seite 1 von 4  1 23     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