Delphi-PRAXiS
Seite 13 von 36   « Erste     3111213 141523     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)

MPirnstill 31. Jan 2006 09:05

Re: MySQL ohne Komponenten
 
Hi!

Wollte nur mal fragen, gibt es so etwas auch für Firebird bzw. würde sich dies darauf anwenden lassen?

Gruß

Chewie 31. Jan 2006 13:38

Re: MySQL ohne Komponenten
 
Das ist die API für MySQl. Andere Datenbanken besitzen andere APIs.
U.a. aus diesem Grund gibt es Abstraktions-Layer ;)

Chiara87 10. Mai 2006 15:26

Re: MySQL ohne Komponenten
 
Hallo
Ich habe eine Problem.
Ich habe die Unit mysql.pas heruntergeladen und alles gemacht was im Tutorials stand aber wenn ich die Unit compiliere bringt folgende fehler:
Undefinierter Bezeichner: longword, pLongword und Int64.
liegt es daran an das ich Delphi 3 benutze.
Bitte um eine Antwort

Chiara87 10. Mai 2006 16:01

Re: MySQL ohne Komponenten
 
Problem gelöst?
er war wie ich es vermuten habe.
ich hab mit delphi7 probiert und läuft wunderbar.

mimi 30. Jul 2006 18:44

Re: MySQL ohne Komponenten
 
also ich habe mir jetzt nicht alle 9 seiten durchlesen aber ich habe einee frage zu deine tutorial:
ich habe nun folgenden qullcode:
Delphi-Quellcode:
procedure MakeTables(_myCon: PMySQL);
var
  query: PChar;
begin
  mysql_select_db(_myCon, 'APITest');    //zu Datenbank "APITest" wechseln
  query:='CREATE TABLE posts(id int, author int, date datetime, entry text)';
  mysql_real_query(_myCon, 'CREATE TABLE posts(id int, author int, date datetime, entry text)', Length(query));
  query:='CREATE TABLE users(id int, name varchar(50), pass varchar(50))';

  mysql_real_query(_myCon, 'CREATE TABLE users(id int, name varchar(50), pass varchar(50))', Length(query));
end;

procedure CreateDB;
var
  Posts: TPostEntries;
  _myCon: PMySQL;      //unseren Verbindungsdeskriptor
  host, user, pass, db: PChar;      //die Anmeldedaten
  query: PChar;
  _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;
  idAuthor: String;
begin
  //wir werden uns als Root-Benutzer in localhost einloggen, ohne eine
  //bestimmte Datenbank auszuwählen
  host := 'localhost';
  user := 'root';
  pass := 'test';
  db := nil;
 
  //jetzt wird _myCon initialisiert
  _myCon := mysql_init(nil);
  if _myCon = nil then
  begin
    ShowMessage('Nicht genug freier Speicher, um Verbindungsdeskriptor zu initialisieren');
    Exit;
  end;
 
  //anschließend wird die Verbindung hergestellt
  if mysql_real_connect(_myCon, host, user, pass, db, 3306, nil, 0) = nil then
  begin
    ShowMessage('Die Verbindung konnte nicht hergestellt werden. Ursache: ' + mysql_error(_myCon));
    Exit;
  end;
 
//  ShowMessage('Verbindung hergestellt');

  query := 'CREATE DATABASE APITest';
  mysql_real_query(_myCon, query, Length(query));

  MakeTables(_myCon);


  query := 'SELECT * FROM posts ORDER BY id';
  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].id := Integer(_myRow[0]); //ID des Posts ist erstes Feld im Datensatz
    Posts[i].time := _myRow[2];         //Zeitpunkt ist drittes Feld
    Posts[i].text := _myRow[3];         //Text ist viertes Feld
   
    idAuthor := _myRow[1];
    query := PChar('SELECT name FROM users WHERE id=' + idAuthor);
    mysql_real_query(_myCon, query, Length(query));
    _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}

//  for i:=0 to
  mysql_close(_myCon);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateDB;
end;
aber leider bleibt der Array Posts immer leer wie kann ich ihn füllen ?

Chewie 30. Jul 2006 19:00

Re: MySQL ohne Komponenten
 
Klar, dass es leer bleibt, es befinden sich ja keine Einträge in den Tabellen!
Die Tabellen werden ja nur erzeugt, nicht befüllt! Dies müsstest du dann selbst mit entsprechenden INSERT-Statements machen.

mimi 31. Jul 2006 14:03

Re: MySQL ohne Komponenten
 
ich habe jetzt ein insert befehl hinzugefügt, doch sie bleibt immer noch leer:
Delphi-Quellcode:

procedure MakeTables(_myCon: PMySQL);
var
  query: PChar;
begin
  mysql_select_db(_myCon, 'APITest');    //zu Datenbank "APITest" wechseln
  query:='CREATE TABLE posts(id int, author int, date datetime, entry text)';
  mysql_real_query(_myCon, 'CREATE TABLE posts(id int, author int, date datetime, entry text)', Length(query));
  query:='CREATE TABLE users(id int, name varchar(50), pass varchar(50))';

  mysql_real_query(_myCon, 'CREATE TABLE users(id int, name varchar(50), pass varchar(50))', Length(query));
end;
.....
  query := 'CREATE DATABASE APITest';
  mysql_real_query(_myCon, query, Length(query));


  MakeTables(_myCon);

  query := 'SELECT * FROM posts ORDER BY id';
  mysql_real_query(_myCon, query, Length(query));

  // ich bin sicher das muss hier hin doch die db bleibt immer noch leer warum ?
  query:='INSERT INTO posts (id, author, date, entry) VALUES (001, Michael Springwald, 10.10.2006, Dies ist ein test';
  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
  ShowMessage(IntToStr(High(Posts)));

Chewie 31. Jul 2006 14:23

Re: MySQL ohne Komponenten
 
Lass dir mal den Fehlertext zurückgeben (mysql_error()) und lies dir die Dokumentation durch, dann wirst du hoffentlich erkennen, dass String-Literale in Hochkommata eingefasst werden müssen.

Tipp: Besorg dir ein Tool wie z.B. phpMyAdmin und teste dort erstmal, ob die Queries an sich richtig sind und versuche sie erst dann, in der Anwendung auszuführen.

mimi 31. Jul 2006 14:29

Re: MySQL ohne Komponenten
 
es kommt folgende fehlermeldung:

Zitat:

---------------------------
codelib
---------------------------
Commands out of sync; you can't run this command now
---------------------------
OK
---------------------------
ich habe den string so gesetzt:

Delphi-Quellcode:
  query:='INSERT INTO posts (id,author,date,entry) VALUES (001, 5, 10.10.2005 10:35, ''Dies ist ein test'')';
und noch eine kurzte frage wie kann ich die bestehene db abspeichern in eine datei ??? es das Datum bzw. die uhrzeit falschangeben ?

mimi 31. Jul 2006 15:08

Re: MySQL ohne Komponenten
 
habes hinbekommen(fast):
Delphi-Quellcode:
  MakeTables(_myCon);
                                                                 
  // ich bin sicher das muss hier hin doch die db bleibt immer noch leer warum ?
  query:=PChar('INSERT INTO posts(id,author,date,entry) VALUES(1,Mimi,10-10-2005,''Dies ist ein test'')');
  mysql_real_query(_myCon, query, Length(query));


  query := 'SELECT * FROM posts ORDER BY id';
  mysql_real_query(_myCon, query, Length(query));
es gibt in der forschleife aus deinem tutor nur noch eine fehlermeldung:
Zitat:

---------------------------
codelib
---------------------------
Zugriffsverletzung bei Adresse 00457362 in Modul 'codelib.exe'. Lesen von Adresse 00000000.
---------------------------
OK
---------------------------
und noch eine frage wo wird diese db abgespeichert ??? weil der zähler wird immer erhöt bei jedem hinzufügen und beim programm ende !


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.
Seite 13 von 36   « Erste     3111213 141523     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