Thema: Delphi MySQL ohne Komponenten

Einzelnen Beitrag anzeigen

Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#218

Re: MySQL ohne Komponenten

  Alt 10. Feb 2007, 14:52
Ich hab jetzt folgenden Code:
Delphi-Quellcode:
procedure TForm1.BtVTPClick(Sender: TObject);
var
  _myCon: PMySQL; //unseren Verbindungsdeskriptor
  host, user, pass, db: PChar; //die Anmeldedaten
  Posts: TPostEntries;
  idAuthor: String; //zum Zwischenspeichern der Verfasser-ID
  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;
begin


  //wir werden uns als Root-Benutzer in localhost einloggen, ohne eine
  //bestimmte Datenbank auszuwählen
  host := 'localhost';
  user := 'root';
  pass := 'XXXXX';
  db := 'APITest';

  //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 := '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 := StrToInt(_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);
    _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

  //zum Schluss wird die Verbindung wieder geschlossen
  mysql_close(_myCon);
end;
Aber wenn ich dann die Ergebnisse abrufen will, bekomme ich nur eine Fehlermeldung, dass eine Zugriffsverletzung vorliegt. (siehe Anhang)
Woran liegt das?
Angehängte Grafiken
Dateityp: bmp zugriffsverletung_108.bmp (226,0 KB, 17x aufgerufen)
Sven Kannenberg
  Mit Zitat antworten Zitat