![]() |
|
URL dieses Artikels:
Probleme mit Delphi 8 und InterBase 7.1
Frage: Ich versuche mit Delphi 8 auf ein Dezimal-Feld (8,1) in einer Interbase 7.1 Datenbank zuzugreifen. Dabei zeigt mein Programm zwar die vorhandene Werte an, aber sobald ich einen neuen Wert speichere, wird immer 0 in die Datenbank geschrieben. Was mache ich falsch oder wir kann ich den neuen Wert sonst noch speichern?
Antwort: Zwar hat BDP.NET einige Probleme (auch beim Zugriff auf eine InterBase-Datenbank), aber der geschilderte Fall sollte funktionieren, solange nur Ganzzahlen beteiligt sind. Ich schlage vor, das Ganze in einer kleinen Testanwendung nochmals zu prüfen. Schritt 1: Neue DIALECT 3-Datenbank für den InterBase 7.1 erzeugen Schritt 2: Neue Testtabelle über IBConsole in der neuen Datenbank anlegen CREATE TABLE DezimalTest ( RecID INTEGER NOT NULL PRIMARY KEY, Wert DECIMAL(8,1) NOT NULL )Schritt 3: Mit IBConsole einen Testdatensatz eintragen, der als Wert den Eintrag 0 verwendet. Schritt 4: In Delphi 8 ein neues Windows Forms-Projekt anlegen. Die Tabelle DezimalTest wird dann vom Daten-Explorer über Drag&Drop auf das Formular gezogen. Mit einem rechten Mausklick auf die BdpDataAdapter1-Komponente ist der Menüpunkt Typisierte Datenmenge erzeugen... erreichbar. Im daraufhin sichtbaren Konfigurationsdialog die Vorbelegung übernehmen. Schritt 5: Die BdpDataAdapter1-Eigenschaft DataSet auswählen und im Objektinspektor die im Schritt 4 erzeugte DataSet-Instanz aus der Liste übernehmen. Die BdpDataAdapter1-Eigenschaft Active auf True setzen. Schritt 6: Die DataGrid-Komponente auf dem Formular ablegen und die Eigenschaften DataSource und DataMember zuweisen (DataSet-Instanz aus dem Schritt 4). Das Formular zeigt den Testdatensatz der Tabelle sofort an (Live Data). Schritt 7: Aufruf der BdpDataAdapter1-Methode Update nachrüsten. Dabei muss der zu aktualisierende Tabellennamen mit angegeben werden, damit der BdpDataAdapter nicht den Default-Wert 'TABLE' verwendet (und somit eine Exception auslösen würde). procedure TWinForm.ButtonUpdate_Click(sender: System.Object; e: System.EventArgs); var iRows : Integer; begin iRows := BdpDataAdapter1.Update(DataSet11, 'DezimalTest'); MessageBox.Show(iRows.ToString); end;Schritt 8: Das Programm starten, im DataGrid den Wert 0 auf den Wert 1 ändern und dann den Button Update anklicken - die MessageBox zeigt daraufhin den Rückgabewert 1 (für einen aktualisierten Datensatz anzeigen) an. Auch in der IBConsole ist der neue Wert zu sehen. P.S: Der Datentyp DECIMAL(8,1) ist keine gute Wahl, da der InterBase diesen Wert intern als INTEGER abbildet, so dass die universellen BDP.NET-Klassen daraus den Parameter-Typ System.Int32 machen. Im DataGrid kann der Anwender somit keine Werte eintragen, die eine Nachkommastelle haben. Dieser Spuk verschwindet erst dann, wenn man zur Kombination a) DECIMAL(10,1) oder NUMERIC(10,1) und b) DIALECT 1-Datenbank greift. Erst dann, wenn bei DECIMAL/NUMERIC der PRECISION-Wert größer als 9 ist, verzichtet der InterBase bei einer DIALECT 1-Datenbank auf den INTEGER-Trick. Bei einer DIALECT 3-Datenbank hilft das aber nicht, da der InterBase dann einen INT64 daraus macht, so dass BDP.NET wiederum nur Ganzzahlen zulässt. |
|
© 2002 Software & Support Verlag GmbH. Vervielfältigung
nur mit Genehmigung des Verlags. Alle Markennamen sind in der Regel
eingetragene Warenzeichen der entsprechenden Unternehmen oder Organisationen.
Fragen? ... zum Angebot des Software & Support Verlags: info@entwickler.com ... zu dieser Website: webmaster@entwickler.com |