Entwickler-Ecke

Datenbanken - Problem mit Memos in DB


burli - Mo 08.09.03 01:46
Titel: Problem mit Memos in DB
Hi,
ich hab folgendes Problem: ich möchte einen längeren Text aus einem Memo in einem Blob oder Text Feld ablegen. Dazu hab ich mit in einer Tabelle (MySQL) ein entsprechendes Feld definiert und auf das Forumular ein DBMemo gelegt.
Wenn ich einen neuen Datensatz anlege bekomme ich immer die Fehlermeldung

user defined image

Der Datensatz wird aber gespeichert. Ich kann aber über DBNav in der Tabelle herumblättern und es wird auch alles im Memofeld angezeigt und ich kann auch problemlos bestehende Datensätze editieren. Der Fehler tritt wirklich nur beim Anlegen eines neuen Datensatzes und nur in Verbindung mit Blob's auf.

Ich verwende die BDE, ODBC und MySQL jeweils in einer aktuellen Version

Irgend eine Idee was das sein könnte?

Gruß
Markus

PS: Die Einstellung von Table.FieldDefs.DataType auf ftMemo oder ftFmtMemo (Default war ftBlob) hat auch nichts gebracht


burli - Di 09.09.03 11:44

Hm, hat keiner ne Idee? Ich komme hier nämlich nicht mehr weiter. Ich habe sogar ne neue DB mit nur einer Tabelle mit einem int und einem Blob Field angelegt und ein Programm erstellt das nichts anderes enthält als nen DBNav, ein DBEdit und ein DBMemo.
Aber jedesmal beim Erstellen bekomme ich oben genannte Fehlermeldung
Bin für jede Hilfe dankbar
Gruß
Markus


burli - Di 09.09.03 12:19

Ich bin grad nen Schritt weitergekommen. Es muß an der Tabelle liegen. Bei einer anderen Tabelle, die auch ein Blob Feld enthält, tritt der Fehler nicht auf.
Der einzigen Unterschied den ich bisher finden konnte liegt darin, das die eine Tabelle in Access erstellt und über ODBC in die MySQL DB exprotiert wurde (da gehts) und die andere Tabelle hab ich mit MySQL CC erstellt (da gehts nicht)
Gibt es noch irgendwelche Parameter die von MySQL CC nicht angezeigt werden?


burli - Di 09.09.03 13:29

So, ich hab das Problem zwar jetzt gelöst, verstehen tu ich es aber nicht.
Wenn ich eine Tabelle mit MySQL CC erstelle die eine Blob Spalte enthält und ich versucht von Delphi aus darauf zuzugreifen taucht obenstehehendes Problem auf.

Wenn ich die Tabelle mit Access erstelle (mit Memo Spalte) und über ODBC in MySQL exportiere funktioniert es. In der Tabelle steht die Spalte dann auch als Blob und ich kann zu der anderen Variante keinen Unterschied feststellen.

Wenn ich die mit MySQL CC Tabelle über ODBC in Access importiere wird aus der Blob Spalte ein OLE-Objekt. Ändere ich das in Memo und exportiere die Tabelle wieder gehts.

Warum funktioniert der "reguläre" Weg nicht sondern nur der Umweg über Access und ODBC? Ändert ODBC irgendwie die Daten eines Blob um? Kann sonst noch jemand das nachvollziehn?

Gruß
Markus


neojones - Mi 10.09.03 10:22

Warum nimmst Du nicht einfach ein Feld vom Typ "TEXT"?


burli - Mi 10.09.03 10:38

Weil da genau das gleiche passiert. Text ist vom Format her auch ein Blob
Mittlerweile habe ich den MyODBC Treiber im Verdacht. :evil:
Ich vermute, der ändert irgend eine Kleinigkeit um. Es macht zumindest diesen Eindruck.
Zumindest gibt es einen Unterschied zwischen dem Erstellen einer Tabelle ohne ODBC und mit ODBC


neojones - Mi 10.09.03 12:20

Wie meinst Du das? Text kann eigentlich kein BLOB-Format haben. Was für ein Text ist das denn?


burli - Mi 10.09.03 12:27

Normale Char, Varchar oder andere Textfelder können meines Wissens nur maximal 256 Zeichen haben. Für das Feld braucht ich aber mehr, und da bleibt nur Blob oder Text. Und das ist im Prinzip das gleiche. Nur der Typ heißt anders


neojones - Mi 10.09.03 12:58

Nein, ist es nicht. TEXT unterscheidet sich ganz gewaltig von BLOB...

Es gibt zwar Datenbanken, wo das dasselbe ist, bei mySQL ist es das aber nicht.

Und den Text liest Du einfach ein, indem Du ihn in einen umgebrochenen String konvertierst und dann mit

Table1.FieldByName('feldname').AsString := Variable

zuweist.

Viele Grüße,

Matthias


burli - Mi 10.09.03 13:59

Ja, aber es geht mir im moment nicht um den Typ sondern um die Art und Weise in der die Daten gespeichert werden. Und da sind sich Blob und Text ähnlich.
Es war auch egal ob ich Blob oder Text für die Spalte verwendet habe, es kam immer der oben beschriebene Fehler


neojones - Mi 10.09.03 14:53

Dann poste mal den Quellcode, wie Du den BLOB übertragen hast.


neojones - Mi 10.09.03 15:00

Ach so, und die Tabellenstruktur wäre noch wichtig.


burli - Mi 10.09.03 15:02

Da gibts keinen Quellcode. Ich habe die Tabelle entweder mit MySQL CC oder mit Access über MyODBC erstellt.
Zum Auslesen hab ich lediglich ein DBMemo genommen
Zum Testen hab ich eine Tabelle angelegt die nichts anderes enthält als die Blob Spalte


neojones - Mi 10.09.03 15:08

Ist die Blob-Spalte als NOT NULL oder KEY definiert?


burli - Mi 10.09.03 15:09

Hab ich alles durchprobiert


neojones - Mi 10.09.03 15:12

Also ich habs jetzt bei mir mit Feldtyp "TEXT" auf einer 3.23 probiert. Funktioniert einwandfrei.


burli - Mi 10.09.03 15:29

Zu den Versionen: Ich hab eine 4er MySQL DB (weiß grad nicht genau welche), MyODBC 3.51, Delphi7 Ent und WinXP
Ich hab alles was vom mir kommt auf ein Minimum reduziert um Fehlerquellen auszuschließen. Von mir stammt eigentlich nur eine Tabelle mit einer Spalte (Blob) und ein Delphi Projekt in dem es nur je eine DBTable, DBDataSource und DBMemo gibt. Sourecode habe ich keinen dazugefügt und die Möglichen Einstellungen im Objektmanager müsste ich auch schon alle ausprobiert haben.
Fakt ist, das das oben beschriebene Verhalten bei mir nachvollziehbar ist.
Blob Feld mit MySQL CC erstellen und Auslesen in ein DBMemo führt zu obrigem Fehler, Erstellen des Blob Feldes in Access und export über MyODBC funktioniert


neojones - Mi 10.09.03 15:30

Probier mal das Feld mit myAdmin (http://www.myadmin.org) zu füllen.

Wenn das nicht geht, liegts an der mySQL 4, wenns geht, liegts am myODBC.


UGrohne - Mi 10.09.03 16:36

Lies mal die Fehlermeldung genau: "Für diese Operation ist eine Nicht-BLOB-SPalte in der Tabelle erforderlich"
Vielleicht solltest Du diesem Hinweis mal Folge leisten und z.B. einen Primary Key einbauen?


burli - Mi 10.09.03 16:44

Ich hatte auch schon Tabellen mit Key.
Für mich ist der Fall eigentlich klar. MyODBC scheint hier irgendwas nicht 100% umzusetzen. Ich sehe sonst keine andere Möglichkeit. Hab sonst schon alles andere ausgeschlossen was mir eingefallen ist


UGrohne - Mi 10.09.03 16:46

Du sagtest doch, dass trotzdem alles einwandfrei läuft, bis auf diesen Fehler?
Dann fang die Fehlermeldung doch einfach ab und beachte sie nicht weiter. Ist zwar nicht ganz sauber, aber immerhin besser, als die ganze zeit mit solchen Fehlern zu leben....