TADOQuery->Post() und Float-Problematik



  • Hallo zusammen,

    ich sitze seit gestern an einem Problem, das ich mir einfach nicht erklären kann. Vielleicht hat von euch jemand hierzu schon Erfahrungen oder Tipps für mich.

    Erstmal meine Ausgangssituation:
    Über die TADOQuery-Komponente stelle ich eine Verbindung zu einer MySQL-Datenbank her (mit Hilfe des MySQL ODBC Connectors). Die Verbindung klappt einwandfrei. Dann lasse ich mir mit einer Query wie "SELECT * FROM artikel WHERE artikelnr = 10" einen Datensatz heraussuchen und zeige die Daten mittels TDBEdit-Komponenten an. Bis hierher auch noch kein Problem. Das Problem kommt ab dem Zeitpunkt, zu dem ich in den Feldern Änderungen vornehmen will.

    Das Phänomen:
    Ändere ich die Daten eines String-Feldes, kann ich in die DBEdit-Felder eingeben was ich will und das ganze per ->Post() zur Datenbank schicken. Klappt immer. Handelt es sich bei dem Datenbankfeld jedoch um ein Float- bzw. Decimal-Feld, dann passiert bei ->Post() folgendes:

    Wenn in dem Float-Feld noch nichts stand: In diesem Fall kann ich Ganzzahlen (!) eingeben, so viele ich will. Ein ->Post() speichert das ganze ohne Probleme. Gebe ich jetzt eine Zahl mit einer Nachkommastelle ein, geht das ganze in der Regel auch noch problemlos. Sobald ich jedoch eine zweite (oder mehr) Nachkommastellen eingebe, speichert er beim ersten ->Post() zwar ohne Probleme, danach kann ich an diesem Feld jedoch nie wieder eine Änderung vornehmen.
    Sobald ich versuche, z. B. wieder eine Ganzzahl in dem Feld zu speichern (oder auch eine andere Nachkommazahl) krieg ich immer die Meldung Fehler: Die zum Ändern vorgesehene Zeile konnte nicht gefunden werden.

    Ich hab schon alles mögliche Probiert, aber egal was ich mache, ich krieg immer dasselbe Ergebnis.

    Gibt es vielleicht im MyOCBC-Connector Einstellungen, die für so ein Verhalten verantwortlich sein könnten?
    Mir ist auch aufgefallen, daß ich, wenn ich z. B. den Wert "3,4" eingebe, Er der Wert wie oben beschrieben so in der Datenbank abspeichert, das DBEdit-Feld zeigt jedoch sowas an wie "3,395000000000". Das krieg ich nur weg, wenn ich die Formatierung angebe, sollte doch aber auch nicht sein, oder?

    Jetzt hab ich so viel geschrieben - hoffentlich liest das überhaupt jemand bis zum Ende durch 🙂

    Auf jeden Fall wäre ich für jeden Tip unglaublich dankbar.

    Mipe



  • Kann es sein das du den BCB5 verwendest und noch nicht den ADO Patch von Borland installiert hast?



  • Nein, ich verwende den 6er-Builder. Ob da natürlich jetzt ein Patch fehlt, weiß ich nicht. Gab's da diesbezüglich mal Probleme?



  • Welchen Datentyp hat Deine Spalte in der MySQL-Table genau(z.B. decimal(x,y))?

    Wie sieht Dein PrimaryKey aus ?



  • Also der Datentyp der MySQL-Datenbank lautet:

    `vk_netto` float NOT NULL default '0'

    der Index:

    `id` bigint(20) NOT NULL auto_increment

    Ich hab testweise eine neue Tabelle angelegt, die nur aus diesen zwei Feldern und einem VARCHAR-Feld besteht. Danach hab ich eine Testapplikation geschrieben, die wirklich nur einen Datensatz holt, ich ändere ihn und sie schreibt ihn per Post() wieder zurück in die Datenbank.

    Aber auch hier genau dasselbe Ergebnis. Ändere ich den VARCHAR, geht es jedesmal ohne Probleme. Ändere ich den Float-Wert immer nur in eine Ganzzahl - auch keinerlei Probleme. Sobald ich jedoch Nachkommastellen eingebe, geht es beim ersten mal immer, die folgenden ca. 3 mal manchmal auch noch, ansonsten kann ich das Float-Feld nicht mehr ändern.
    Also auch wenn ich die Applikation neu starte, die Datenbankverbindung neu aufbau, mir diesen Datensatz wieder hole und versuche, das Float-Feld zu ändern, bringt Post() wieder denselben Fehler ("Eine zum aktualisieren... Zeile wurde nicht gefunden.... Werte wurden evtl. geändert...").

    Ich hab's auch schon decimal(10,2) probiert - gleiches Ergebnis. Dann hab ich aus dem BigInt-Index einen Int gemacht - gleiches Ergebnis. Danach hab ich sämtliche Einstellungen des MyODBC-Connectors durchprobiert - gleiches Ergebnis. Ich hab auch im Programm die ADOQuery nochmal in den Edit()-Mode versetzt, hat aber auch nicht funktioniert. Zuletzt hab ich auch noch den Unterstrich im Feldnamen entfernt, aber auch hier derselbe Fehler.

    Nur wenn ich mir im Programm händisch ein
    "UPDATE artikeld SET vk_netto = 'xx.xxxxxx' WHERE id = 1"
    erstelle, und das ganze mittels ADOCommand ausführe, speichert er den Wert ohne Probleme.

    Muß ich vielleicht bei der Verwendung von Post() bei Datensatzänderungen irgendwas besonderes beachten?

    Mipe



  • Das könnte auch am ODBC-Treiber liegen. Oder an der Art und Weise, wie ADO den Post()-Befehl in die entsprechenden Answeisungen umsetzt. Da sind einfach zu viele Zwischenstufen, um das so aus der Ferne zu diagnostizieren.

    Ich kann nur empfehlen grundsätzlich TADOCommand zu verwenden und entsprechenden SQL-Statements zu verwenden.


Anmelden zum Antworten