Delphi-PRAXiS
Seite 7 von 9   « Erste     567 89      

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)

pemue 24. Jan 2008 07:32

Re: MySQL ohne Komponenten
 
Ich hab mal noch eine frage, und zwar wenn ich die Thread ID ermitteln will, tue ich das doch mit 'mysql_thread_id()'.
Ich bin leider da noch nicht so ganz durchgestiegen welche Var muss ich jetzt deklarieren, und wie/wo ermittel ich die id?
Ein Codebsp würde mir da mit sicherheit weiterhelfen, ich brauche ja nur erstmal den Ansatz.

Danke
Pemue

Hat sich schon erledigt, ...

pemue 25. Jan 2008 07:31

Re: MySQL ohne Komponenten
 
So aber jetzt habe ich mal noch ein Anliegen:
und zwar beim auslesen der Spaltenüberschriften.

Delphi-Quellcode:
var
  _myFields: PMYSQL_FIELD;
 
{...}
begin
{...}

  _myFields:= mysql_fetch_field(_myRes);
  ShowMessage(String(_myFields.name));

{...}
end;
das ganze erstmal nur zu testzwecken... aber es wird immer nur 'id' ausgegeben, obwohl die spaltenüberschriften der Tabelle: 'id', 'author', 'date' und 'entry' sind...
Was mache ich falsch?

DeddyH 25. Jan 2008 07:34

Re: MySQL ohne Komponenten
 
Du liest ja auch immer nur den ersten Wert. Gibt es so etwas wie mysql_enumfields? Wenn ja, müsstest Du das aufrufen und in einer Schleife durch die Felder iterieren.

pemue 25. Jan 2008 07:58

Re: MySQL ohne Komponenten
 
ja es gibt _type: enum_field_types im TMYSQL_FIELD = record.
aber wenn ich jetzt schreibe:
Delphi-Quellcode:
 
for i := 0 to High(Posts) do
  begin
    _myFields:= mysql_fetch_field(_myRes);
    ShowMessage(_myFields._type[i]);
end;
Dann kommt immer: 'Array-Typ erforderlich';
aber wenn ich das array in der mysql.pas reinschreibe
Delphi-Quellcode:
  TMYSQL_FIELD = array[0..MaxInt div SizeOf(pChar) - 1] of pChar;
sagt er mir 'bezeichner redifiniert'

DeddyH 25. Jan 2008 08:45

Re: MySQL ohne Komponenten
 
Der Link zur Header-Übersetzung im ersten Post ist leider tot. Daher rate ich mal ins Blaue: wenn die Funktionen so heißen wie in PHP und auch so ähnlich arbeiten, kannst Du Folgendes einfach nach Delphi übersetzen (das Beispiel unten): http://www.selfphp.de/funktionsrefer...ist_fields.php

pemue 25. Jan 2008 10:07

Re: MySQL ohne Komponenten
 
Den Header kann man Hier herunterladen, vielleicht kannst du mir dann etwas besser helfen, denn ich bekomme es leider nicht auf die reihe den php-code zu übersetzen :(

[EDIT:]

also im header steht ja
Delphi-Quellcode:
  mysql_list_fields: function(_mysql: PMYSQL; const table, wild: pChar): PMYSQL_RES; stdcall;
nur leider weis ich mit diesem 'wild' nichts anzufangen
ich habe jetzt folgenden code:
Delphi-Quellcode:
  query := 'SHOW COLUMNS FROM posts';
  mysql_real_query(_myCon, pchar(query), Length(query));
  _myRes := mysql_list_fields(_mysql, 'posts', ); //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;

DeddyH 25. Jan 2008 10:27

Re: MySQL ohne Komponenten
 
Ich kann das gerade hier nicht testen, da es schon beim mysql_init kracht. Mal sehen, ob ich heute Abend zu Hause etwas probieren kann.

pemue 25. Jan 2008 10:32

Re: MySQL ohne Komponenten
 
dankeschön das währe echt nett von dir, vielen dank schonmal ich freu mich auf eine erfolgsversprechende antwort

Chewie 25. Jan 2008 12:10

Re: MySQL ohne Komponenten
 
Leute, was meint ihr denn, wozu MySQL die Schnittstellen der APIs beschreibt? Auf jeden Fall nicht, damit Leute rätselraten, was wohl bestimmte Parameter bedeuten ;-)

Hier steht wasa über diese Funktion.

DeddyH 25. Jan 2008 12:32

Re: MySQL ohne Komponenten
 
Du kannst es ja mal so versuchen (ungetestet):
Delphi-Quellcode:
type TErgebnis = array of string;
var Ergebnis: TErgebnis;
    Row: PMySQL_Row;

...

query := 'SHOW COLUMNS FROM posts';
  mysql_real_query(_myCon, pchar(query), Length(query));
  _myRes := mysql_store_result(_myCon);
  if _myRes = nil then
  begin
    ShowMessage('Es konnten keine Datensätze zurückgebenen werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
  SetLength(Ergebnis, mysql_num_rows(_myRes));
  for i := Low(Ergebnis) to High(Ergebnis) do
    begin
      Row := mysql_fetch_row(_myRes);
      Ergebnis[i] := Row[0];          //Name des Felds
    end;
  mysql_free_result(_myRes);
  SetLength(Ergebnis,0);

DeddyH 25. Jan 2008 17:58

Re: MySQL ohne Komponenten
 
So, das hat super funktioniert (ich nutze eine Listview zur Anzeige mit Namen lv1, vsReport mit 6 Spalten):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Con: PMYSQL;
    host, user, pass, db: PChar;
    Row: PMySQL_Row;
    Res: PMYSQL_RES;
    query: string;
    i,j: integer;
    Item: TListItem;
begin
  host := 'localhost';
  user := 'root';
  pass := '';
  db  := 'dptest';

  Con := mysql_init(nil);
  if Assigned(Con) then
    try
      if Assigned(mysql_real_connect(Con, host, user, pass, db, 3306, nil, 0)) then
        begin
          query := 'SHOW FIELDS FROM blubb';
          mysql_real_query(Con,PChar(query), Length(query));
          Res := mysql_store_result(Con);
          if Assigned(Res) then
            for i := 0 to mysql_num_rows(Res) - 1 do
              begin
                Row := mysql_fetch_row(Res);
                Item := lv1.Items.Add;
                Item.Caption := Row[0];
                for j := 1 to mysql_num_fields(Res) - 1 do
                  Item.SubItems.Add(Row[j]);
              end;
        end
      else
        ShowMessage(mysql_error(Con));
    finally
      mysql_close(Con);
    end;
end;

Mackhack 27. Jan 2008 03:25

Re: MySQL ohne Komponenten
 
Wo gibt es denn die aktuellen MySQL pas files und dlls die benoetigt werden?

DeddyH 27. Jan 2008 11:31

Re: MySQL ohne Komponenten
 
Die DLLs liefert MySQL selbst mit (denke ich zumindest, ich habe sonst keine installiert) und die *.pas bekommst Du hier.

pemue 31. Jan 2008 11:06

Re: MySQL ohne Komponenten
 
Habe mal noch eine Frage, speziell zum Typ 'ENUM'
und zwar wenn ich ein Auswahlfeld in die Tabelle machen will, schicke ich diese Query an den MySQL
Delphi-Quellcode:
query := 'CREATE TABLE Auftrag (ID INT NOT NULL,Auftragsnummer INT, Kundennummer INT NOT NULL, BaustelleAnschrift TEXT, Rohranschlussmaterial TEXT, WinkelangabeInGon ENUM(''grad'', ''gon'') DEFAULT grad, Gefälleangabe ENUM(''%'', ''Promille'', ''1:'') DEFAULT %, CONSTRAINT FK_KN FOREIGN KEY FK_KN (Kundennummer) REFERENCES kunde (ID))';
Aber der Server nimmt diese Query nicht an, ich weis das es an der Text Formatierung des ENUM liegt, und evtl auch des Default wertes.
Ich habe schon ein wenig rumprobiert, bekomme es allerdings nicht hin.
Wie müsste ich den String Formatieren das er vom MySQL richtig verarbeitet wird?

Gruß
Pemue

[EDIT:]
Noch eine Frage, kann man einem integer-Feld vorgeben welche Länge es haben MUSS (also 7 Ziffern) ???

DeddyH 31. Jan 2008 12:01

Re: MySQL ohne Komponenten
 
'%' ist eine Wildcard, wir sich also nicht als ENUM-Element verwenden lassen (oder ich kenne den entsprechenden Trick nicht), und was meinst Du mit der Anzahl der Stellen? Ob eine Zahl 7-stellig ausgegeben wird, ist IMHO eine Frage der Ausgabeformatierung.

[edit] Ansonsten schau mal, ob ZeroFill Dir weiterhilft (bin aus der Beschreibung nicht ganz schlau geworden) [/edit]

pemue 31. Jan 2008 13:35

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von DeddyH
'%' ist eine Wildcard, wir sich also nicht als ENUM-Element verwenden lassen (oder ich kenne den entsprechenden Trick nicht), und was meinst Du mit der Anzahl der Stellen? Ob eine Zahl 7-stellig ausgegeben wird, ist IMHO eine Frage der Ausgabeformatierung.

[edit] Ansonsten schau mal, ob ZeroFill Dir weiterhilft (bin aus der Beschreibung nicht ganz schlau geworden) [/edit]

Ich meine das mit der 7-stelligen Zahl so:
Eine Kundennummer ist z.B. immer 7 Stellig, also soll durch das Feld erzwungen werden das dort nur 7Stellig-vor-dem-Komma-Zahlen gültig sind!

DeddyH 31. Jan 2008 13:54

Re: MySQL ohne Komponenten
 
Versuch es mal mit Constraints.

pemue 1. Feb 2008 07:33

Re: MySQL ohne Komponenten
 
Danke DeddyH das hat funktioniert...
nun habe ich noch eine frage, ich will eine Combobox mit den vorhandenen tabellen einer Datenbank füllen. zu Testzwecken wollt ich die erstmal in ein Memo schreiben.
Mein code schaut so aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
    _myRes: PMYSQL_RES;
begin
query := 'SHOW TABLES FROM apitest';
_myRes:= mysql_real_query(_myCon,Pchar(query), Length(query));
Memo1.Text := _myRES;
end;
allerdings schimpft er mich schon vor dem testen das _myRes kein Integer ist, aber ich will ja auch nen string rausbekommen, bzw mehrere.
Wie also geh ich mit dieser query um? also wie fange ich sie ab und komme dann auf meine Tabellennamen?
das
Delphi-Quellcode:
_myRES: PMYSQL_RES
habe ich so deklariert wiel ich dachte das ist dann richtig.
Sorry bin ein ziemlicher anfänger, aber ich hoffe mir kann doch jemand helfen.
Vielen Dank schonmal für eure Hilfe!

Gruß
Pemue

DeddyH 1. Feb 2008 07:57

Re: MySQL ohne Komponenten
 
Schau Dir nochmal Zeile 23 aus #251 an:
Delphi-Quellcode:
Res := mysql_store_result(Con);
Ich hoffe, das ist nun klarer geworden ;)

pemue 1. Feb 2008 08:47

Re: MySQL ohne Komponenten
 
wo finde ich diese Zeile? in der mysql.pas? dort habe ich sie leider nicht finden können
[edit:] habe es gefunden, aber ich bekomme für _myRes (von PMYSQL_RES) nur '$BE2428' zurück. und es nützt auch nichts wenn ich das dann als string caste

DeddyH 1. Feb 2008 08:53

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von pemue
wo finde ich diese Zeile? in der mysql.pas? dort habe ich sie leider nicht finden können

Hier

DeddyH 1. Feb 2008 09:47

Re: MySQL ohne Komponenten
 
Das Prinzip ist immer das Gleiche:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Con: PMYSQL;
    host, user, pass, db: PChar;
    Row: PMySQL_Row;
    Res: PMYSQL_RES;
    query: string;
    i: integer;
begin
  host := 'localhost';
  user := 'root';
  pass := '';
  db  := 'apitest';

  Con := mysql_init(nil);
  if Assigned(Con) then
    try
      if Assigned(mysql_real_connect(Con, host, user, pass, db, 3306, nil, 0)) then
        begin
          query := 'SHOW TABLES FROM apitest';
          mysql_real_query(Con,PChar(query), Length(query));
          Res := mysql_store_result(Con);
          if Assigned(Res) then
            for i := 0 to mysql_num_rows(Res) - 1 do
              begin
                Row := mysql_fetch_row(Res);
                Memo1.Lines.Add(Row[0]);
              end;
        end
      else
        ShowMessage(mysql_error(Con));
    finally
      mysql_close(Con);
    end;
end;
Ungetestet, sollte aber im Groben funktionieren.

Ykcim 25. Apr 2008 20:42

Re: MySQL ohne Komponenten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ist zwar schon lange her, dass zu diesem Thema etwas geschrieben wurde, aber ich habe eine Frage und finde trotz intensivster Suche keine ANtwort. Ich weiß auch, dass es wahrscheinlich angebracht wäre, einen neuen Beitrag zu erstellen, aber ich hoffe hier eine bestimmte Gruppe von Usern ansprechen zu können - nämliche solche, die Delphi und MySQL ohne Komponenten verbunden haben...

Ich habe alle so gemacht, wie es oben beschrieben wurde - mit großem Erfolg. Allerdings war es nur möglich, StringGrids mit Daten aus der DB zu füllen. Ich benötige eine Möglichkeit, wie ich ein Edit-Feld mit Daten bestücken kann.

Folgendes hatte ich mir überlegt - ohne Erfolg:

Delphi-Quellcode:
function FillEdit(const Datenbank, query, Spalte: string; ED:TEdit): Boolean;
var
   MySQLRes: PMYSQL_RES;
   Field: PMYSQL_FIELD;
   ErrorCode: Integer;
begin
  connect;
   // Datenbank auswählen
   ErrorCode := mysql_select_db(_mycon, PChar(Datenbank));
   if ErrorCode = 0 then
   begin
     // Query ausführen
     ErrorCode := mysql_real_query(_mycon, PChar(query), length(query));
     if ErrorCode = 0 then
     begin
       // Query speichern
       MySQLRes := mysql_store_result(_mycon);
       if Assigned(MySQLRes) then
       begin
          with MySQLRes do
            begin
              ED.Text:=FieldByName(Spalte).AsString;
            end;
       end;
     end;
   end;
end;


procedure TBackForm.Button1Click(Sender: TObject);
var query:string;
    Spalte :string;
begin
connect;
query:='select * from auftrag where FA_NR=100014';
spalte.text:='ArtikelNr';
filledit (DB, query, Spalte, edit1);
disconnect;
end;
Ich bekomme nur Fehlermeldungen. Die Verbindung zur MySQL DB klappt zwar einwandfrei, ich bekomme aber keine einzelnen Daten heraus, sondern nur in einem StringGrid (FillGrid)

Es wäre SPITZE, wenn mir einer weiterhelfen könnte, da ich mit meinem Latein am Ende bin (nach 50-60 Stunden Ausprobieren)..

Danke

hincapie 28. Apr 2008 08:06

Re: MySQL ohne Komponenten
 
Der Fehler ist in folgender Zeile:
Delphi-Quellcode:
   ED.Text:=FieldByName(Spalte).AsString;
Das kann nicht gehen, da Du keine TTable oder TQuery verwendest und daher auch keine TFields hast, die Du mit FieldbyName direkt ansprechen kannst.
Du musst vielmehr den Umweg über das Stringgrid nehmen und das gewünschte Feld auswählen, dann kannst Du den Text als normalen String an das Edit-Feld übergeben...

Schau auch mal in den Beitrag #262 von DeddyH, dort wird das Prinzip eigentlich schon sehr gut erklärt, da wird in ein Memo geschrieben, muss man eigentlich nur auf TEdit umstellen... :coder:

Mackhack 28. Apr 2008 08:28

Re: MySQL ohne Komponenten
 
Oder aber du deklarierst dir ein Record und schreibst dort die Daten rein und nimmst einfach die Information raus und schreibst sie ins TEdit.

Und Spalte.Text gibts net. Spalte := ... wuerde schon eher gehen!

delphinia 12. Dez 2008 22:20

Re: MySQL ohne Komponenten
 
Ich wollte mit der mySQL Direct... einen Insert ausführe, doch sagt mir der Compiler

[Fehler] test_pas.pas(88): String-Literale können maximal 255 Elemente besitzen[code]

ja aber was mach ich nun? mein Insert ist halt über 300 Zeichen da er viele Felder hat... HIIILFE :-)



Geht es nur in dem ich den String aufteile?

Christian Seehase 12. Dez 2008 23:59

Re: MySQL ohne Komponenten
 
Moin Doreen,

Zitat:

Zitat von delphinia
Geht es nur in dem ich den String aufteile?

Ja.

'Literal1'+'Literal2'+...

Jeweils maximal 255 Zeichen.

himitsu 13. Dez 2008 00:18

Re: MySQL ohne Komponenten
 
Der Link im 1. Post ist immernoch veraltet und down.

Vielleicht könnte man ja nun, fast 1,5 Jahre später mal einigen Vorschlägen (von z.B. seite 16) folgen und da Einiges editieren?

Dax 13. Dez 2008 01:19

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von himitsu
Vielleicht könnte man ja nun, fast 1,5 Jahre später mal einigen Vorschlägen (von z.B. seite 16) folgen und da Einiges editieren?

Bitte den genauen Beitrag - der Thread hat bei mir nur 11 Seiten ;)

delphinia 13. Dez 2008 01:20

Re: MySQL ohne Komponenten
 
bei mir 18

himitsu 13. Dez 2008 01:35

Re: MySQL ohne Komponenten
 
aber hier #227, würd ich mal sagen :roll:

samso 29. Mär 2009 08:44

Re: MySQL ohne Komponenten
 
Es gibt nun eine aktualisierte mysql.pas. Diese Version ist mit diversen libmysql.dll's lauffähig.

Neue MySql.pas

Ein Demoprogramm liegt bei.

Die Lizenz wurden in Absprache mit Matthias Fichtner auf die Mozilla Public License Version 1.1 geändert.

Progman 29. Mär 2009 11:32

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von samso
Es gibt nun eine aktualisierte mysql.pas. Diese Version ist mit diversen libmysql.dll's lauffähig.

Neue MySql.pas

Ein Demoprogramm liegt bei.

Die Lizenz wurden in Absprache mit Matthias Fichtner auf die Mozilla Public License Version 1.1 geändert.

Leider ist keine zip-Datei vorhanden ;)

delphinia 29. Mär 2009 11:41

Re: MySQL ohne Komponenten
 
Klar unter dem angegeben link habe ich es runtergeladen! alles ok gerade nochmal getestet!

Progman 29. Mär 2009 12:38

Re: MySQL ohne Komponenten
 
Zitat:

Not Found

The requested URL /delphi\mysql\mysql.zip was not found on this server.
Das kommt bei mir.

delphinia 29. Mär 2009 12:39

Re: MySQL ohne Komponenten
 
Witzig komisch ... also hier mal der direkte link SORRY soll nun kein Deep-Link sein!

http://www.audio-data.de/delphi/mysql/mysql.zip - funktioniert das?!

Progman 29. Mär 2009 12:40

Re: MySQL ohne Komponenten
 
Jetzt hab ichs. Hab die URL von Hand eingegeben und die \ durch / ersetzt, dann kam es auch ;)
(liegt vielleicht am FireFox?)

aberglan 10. Apr 2009 11:12

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von DeddyH
Das Prinzip ist immer das Gleiche:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Con: PMYSQL;
    host, user, pass, db: PChar;
    Row: PMySQL_Row;
    Res: PMYSQL_RES;
    query: string;
    i: integer;
begin
  host := 'localhost';
  user := 'root';
  pass := '';
  db  := 'projet';

  Con := mysql_init(nil);
  if Assigned(Con) then
    try
      if Assigned(mysql_real_connect(Con, host, user, pass, db, 3306, nil, 0)) then
        begin
          query := 'SHOW TABLES FROM tblplayer';
          mysql_real_query(Con,PChar(query), Length(query));
          Res := mysql_store_result(Con);
          if Assigned(Res) then
            for i := 0 to mysql_num_rows(Res) - 1 do
              begin
                Row := mysql_fetch_row(Res);
                Showmessage(Row[0]);
              end;
        end
      else
        ShowMessage(mysql_error(Con));
    finally
      mysql_close(Con);
    end;
end;
Ungetestet, sollte aber im Groben funktionieren.

Hi,

Also vor langer Zeit habe ich bereits einmal mit dieser Unit gearbeitet und hatte keine Probleme damit.
Für ein anderes Projet möchte ich wieder auf eine MySQl-DB zugreifen doch ich bekomme bereits beim
Befehl mysql_init(nil) eine Access Violation Felhermeldung. Weiß einer woran dies liegen kann?

mfg,
Jan

samso 11. Apr 2009 12:24

Re: MySQL ohne Komponenten
 
Vielleicht fehlt
Delphi-Quellcode:
libmysql_load(nil);
Alternativ zu dem Befehl "libmysql_load(nil)" kann auch in mysql.pas die Zeile

Delphi-Quellcode:
{$DEFINE DONT_LOAD_DLL}
in

Delphi-Quellcode:
{.$DEFINE DONT_LOAD_DLL}
geändert werden. Damit wird die libmysql.dll bereits beim Programmstart geladen.

aberglan 13. Apr 2009 12:52

Re: MySQL ohne Komponenten
 
Zitat:

Zitat von samso
Vielleicht fehlt
Delphi-Quellcode:
libmysql_load(nil);

Vielen dank :) Jetzt funktionierts


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.
Seite 7 von 9   « Erste     567 89      

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