Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL - Feld nicht gefunden (https://www.delphipraxis.net/162653-mysql-feld-nicht-gefunden.html)

mjenke 1. Sep 2011 11:43

Datenbank: MySQL • Version: 5.x • Zugriff über: ODBC

MySQL - Feld nicht gefunden
 
Hallo, alle miteinander,


ich habe ein Problem beim Zugriff auf eine externe MySQL-Datenbank, das ich nicht ganz verstehe. Die gleiche Datenbank lokal bereitet hingegen keine Probleme...

Zur Erläuterung:

Ich habe auf einem lokalen MySQL-Server (Version 5.5.8) eine Datenbank, in der unter anderem eine Tabelle mit folgendem Aufbau enthalten ist:

Code:
CREATE TABLE `tbfhe` (
  `id` int(10) NOT NULL auto_increment,
  `idlief` int(10) default NULL,
  `seite` int(10) default NULL,
  `nr` int(10) default NULL,
  `tocub` text,
  `leitsatz` text,
  `fstag` int(10) default NULL,
  `fsmonat` int(10) default NULL,
  `fsjahr` int(10) default NULL,
  `akzsen` varchar(20) default NULL,
  `akzsend` int(10) default NULL,
  `akzbuch` varchar(20) default NULL,
  `akznr` varchar(20) default NULL,
  `akznrd` int(10) default NULL,
  `akzjahr` int(10) default NULL,
  `akzzus` varchar(30) NOT NULL default '',
  `eintyp` varchar(30) default NULL,
  PRIMARY KEY (`id`)
);
Die Verbindung zur Datenbank wird über ODBC (MySQL ODBC 5.1 Treiber) aufgebaut.
Über ein TQuery-Objekt setze ich folgende Abfrage auf die Datenbank ab:

Code:
SELECT DISTINCT t1.*, t2.band, t2.lief FROM tbfhe t1 LEFT JOIN tbandlief t2 ON t1.idlief = t2.id LEFT JOIN tnormen t3 ON t1.id = t3.idbfhe LEFT JOIN tgesetze t4 ON t4.id = t3.idgesetz WHERE t1.idlief = 177 ORDER BY t1.nr
Wenn ich die Daten auslese und weiterverarbeite, ist auch alles in Ordnung:

Delphi-Quellcode:
with FQuery do begin
    SQL.Clear;
    SQL.Add ( Query );
    Open;
    if RowsAffected > 0 then begin
      SetLength ( BFHE^, RowsAffected );
      counter := 0;
      while not EOF do begin
        BFHE^[counter].ID      := FieldByName ( 'id' ).AsInteger;
        BFHE^[counter].IDLIEF  := FieldByName ( 'idlief' ).AsInteger;
        BFHE^[counter].SEITE   := FieldByName ( 'seite' ).AsInteger;
        BFHE^[counter].NR      := FieldByName ( 'nr' ).AsInteger;
        BFHE^[counter].TOCUB   := _recodeFromMySQL ( FieldByName ( 'tocub' ).AsString );
        BFHE^[counter].LEITSATZ := _recodeFromMySQL ( FieldByName ( 'leitsatz' ).AsString );
        BFHE^[counter].FSTAG   := FieldByName ( 'fstag' ).AsInteger;
        BFHE^[counter].FSMONAT := FieldByName ( 'fsmonat' ).AsInteger;
        BFHE^[counter].FSJAHR  := FieldByName ( 'fsjahr' ).AsInteger;
        BFHE^[counter].AKZSEN  := _recodeFromMySQL ( FieldByName ( 'akzsen' ).AsString );
        BFHE^[counter].AKZSEND := FieldByName ( 'akzsend' ).AsInteger;
        BFHE^[counter].AKZBUCH := _recodeFromMySQL ( FieldByName ( 'akzbuch' ).AsString );
        BFHE^[counter].AKZNR   := _recodeFromMySQL ( FieldByName ( 'akznr' ).AsString );
        BFHE^[counter].AKZNRD  := FieldByName ( 'akznrd' ).AsInteger;
        BFHE^[counter].AKZJAHR := FieldByName ( 'akzjahr' ).AsInteger;
        BFHE^[counter].AKZZUS  := _recodeFromMySQL ( FieldByName ( 'akzzus' ).AsString );
        BFHE^[counter].EINTYP  := _recodeFromMySQL ( FieldByName ( 'eintyp' ).AsString );
        BFHE^[counter].BAND    := FieldByName ( 'band' ).AsInteger;
        BFHE^[counter].LIEF    := FieldByName ( 'lief' ).AsInteger;
        SetLength ( BFHE^[counter].STICHWORTE, 0 );
        SetLength ( BFHE^[counter].NORMEN, 0 );
        SetLength ( BFHE^[counter].GRPMITGL, 0 );
        Inc ( counter );
        Next;
      end;
    end;
    Close;
  end;
Problematisch wird es erst, wenn ich auf die externe MySQL-Datenbank zugreife. Diese Datenbank wurde mit den gleichen CREATE-Statements (gleiche SQL-Datei) erzeugt und auch mit den gleichen Daten gefüllt (durch das gleiche Perl-Skript, mit dem ich die Daten in die lokale MySQL-DB geschrieben habe). Datentechnisch sind sie also identisch.

Die externe MySQL-Datenbank läuft auf einem MySQL-Server der Version 5.0.51a.

Das eigentliche Problem ist nun: Alle Felder, die als "text" angelegt sind (also "tocub", "leitsatz" etc.), werden hier nicht gefunden. Sie tauchen in der FieldList des TQuery-Objekts überhaupt nicht auf.

In der Datenbank sind sie aber vorhanden und gefüllt, denn mit anderen Programmen (Perl) kann ich auf sie zugreifen und sie auslesen...

Kennt jemand von Euch dieses Verhalten?


Vielen Dank für die Hilfe!!

Matthias

Bernhard Geyer 1. Sep 2011 11:51

AW: MySQL - Feld nicht gefunden
 
Ich Tipp mal darauf das diese MySQL-Version die Felder mal wieder fehlerhaft vom Typ zurückliefert und die BDE damit nicht zurecht kommt.

Mein Tipp: Schmeiß die hoffnungslos veraltete BDE weg und nimm notfalls (wenn du die SW nicht verkaufst) ZEOS für den direkten MySQL-Zugriff.

FaTaLGuiLLoTiNe 1. Sep 2011 13:04

AW: MySQL - Feld nicht gefunden
 
Ich stand zufälligerweise gerade vor dem gleichen Problem, das ist offensichtlich ein Zeichensatz/Collation Problem welches die BDE mit den MySQL Tabellen hat.

Bei mir hat ein Downgrade auf den MySQL Connector/ODBC 3.15 geholfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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 by Thomas Breitkreuz