Announcement

Collapse
No announcement yet.

Probleme mit Delphi 8 und Interbae 7.1

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Delphi 8 und Interbae 7.1

    Ich versuche mit Delphi8 auf ein Dezimal-Feld (8,1) in einer Interbase 7.1 Datenbank zuzugreifen, er zeig mir zwar vorhandene Werte an, aber sobalt ich speichere wird immer 0 in die Datenbank geschrieben.

    Was mache ich falsch oder wir kann ich werte sonst noch speichern?

    Marcus

  • #2
    Hallo,

    >Was mache ich falsch..

    gute Frage. 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: Testtabelle über IBConsole anlegen
    <pre>
    <b>CREATE</b> <b>TABLE</b> DezimalTest
    (
    RecID <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>PRIMARY</b> <b>KEY</b>,
    Wert <b>DECIMAL</b>(8,1) <b>NOT</b> <b>NULL</b>
    )
    </pre>

    Schritt 3: Mit IBConsole einen Testdatensatz anlegen, der als Wert den Eintrag 0 verwendet.

    Schritt 4: Delphi 8: Neues Windows Forms-Projekt anlegen. Tabelle <i>DezimalTest</i> vom Daten-Explorer über Drag&Drop auf das Formular ziehen. Rechter Mausklick auf <i>BdpDataAdapter1</i> und Menüpunkt <b>Typisierte Datenmenge erzeugen...</b> auswählen (dabei die Vorbelegung im Dialog für das typisierte DataSet übernehmen).

    Schritt 5: BdpDataAdapter1-Eigenschaft <b>DataSet</b> auswählen; BdpDataAdapter1-Eigenschaft <b>Active</b> auf True setzen.

    Schritt 6: <b>DataGrid</b> auf dem Formular ablegen und Eigenschaften <b>DataSource</b> und <b>DataMember</b> zuweisen. Live Data sind zu sehen...

    Schritt 7: Update einrichten
    <pre>
    <b>procedure</b> TWinForm.ButtonUpdate_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>var</b>
    iRows : Integer;
    <b>begin</b>
    iRows := BdpDataAdapter1.Update(DataSet11, <font color="#9933CC">'DezimalTest'</font>);
    MessageBox.Show(iRows.ToString);
    <b>end</b>;
    </pre>
    Schritt 8: Programm starten, im DataGrid den Wert 0 auf den Wert 1 ändern. Button Update anklicken - die MessageBox sollte den Rückgabewert 1 (für einen aktualisierten Datensatz anzeigen).

    P.S: Der Datentyp <i>DECIMAL(8,1)</i> 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 <br>
    a) DECIMAL(10,1) oder NUMERIC(10,2) und <br>
    b) SQL DIALECT 1-Datenbank <br>
    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

    Comment

    Working...
    X