Announcement

Collapse
No announcement yet.

Warum ist bei IBDataSet beim Einfügen erst SELECT notwendig?

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

  • Warum ist bei IBDataSet beim Einfügen erst SELECT notwendig?

    Hallo,

    ich habe da eine Frage (Delphi5, InterBase 6 und IBX 4.52):<br>
    Warum muss ich beim IBDATASET wenn ich ein INSERT INTO DB vorher eine SELECT abfrage machen?<br>
    Wenn meine DB sehr groß wird habe ich dann nicht auch lange Wartezeiten?
    Der Grund warum ich auf IBX übergegangen bin ist, dass ich die langen Wartezeiten bei der BDE beim laden meiner DB umgehen wollte (Tipp von Herrn Kosch).<br>
    Ich benutze für den Zugriff folgende IBX Elemente:<br>
    IBDataBase, IBTransaction und IBDataSet.<br>

    Danke Walter

  • #2
    Hallo,

    kann das Problem näher beschrieben werden - wie sieht die Konfiguration im Detail aus?

    Wenn man nur neue Datensätze über TIBDataSet eintragen will, ohne die bisher vorhandenen laden zu müssen, kann man zu folgendem Trick greifen:
    <pre>
    object IBDataSet1: TIBDataSet
    Database = IBDatabase1
    Transaction = IBTransaction1
    BufferChunks = 1000
    CachedUpdates = False
    DeleteSQL.Strings = (
    'delete from TEST1'
    'where'
    ' ID = :OLD_ID')
    InsertSQL.Strings = (
    'insert into TEST1'
    ' (ID, DATUM, WERT)'
    'values'
    ' (:ID, ATUM, :WERT)')
    RefreshSQL.Strings = (
    'Select '
    ' ID,'
    ' WERT,'
    ' DATUM'
    'from TEST1 '
    'where'
    ' ID = :ID')
    SelectSQL.Strings = (
    'select ID, DATUM, WERT from TEST1 where 1=2')
    ModifySQL.Strings = (
    'update TEST1'
    'set'
    ' ID = :ID,'
    ' DATUM = ATUM,'
    ' WERT = :WERT'
    'where'
    ' ID = :OLD_ID')
    Active = True
    Left = 72
    Top = 24
    end
    </pre>
    Über die Abfrage <i>select ID, DATUM, WERT from TEST1 <b>where 1=2</b></i> fordert das Programm eine Datenmenge an, die garantiert leer ist und nur die Feldstruktur der Tabelle zurückliefert. Über TIBDataSet kann man nun neue Datensätze einfügen, da IBX nun den exakten Aufbau dieser Tabelle "kennt"

    Comment


    • #3
      Hallo Andreas,

      erst mal danke für die schnelle Antwort!<br>
      Du hast mal wieder in die Delphi Trick-Kiste gegriffen! Es klappt jetzt so wie ich es mir vorstelle.<br>
      Ich habe, wenn keine SQL-Select-Abfrage vorhanden war, und ich nur einen neuen Datensatz einfügen wollte eine Fehlermeldung bekommen: "Leere Datenabfrage" oder so ähnlich.
      Nun noch etwas zu meiner Frage --> Warum benötigt IBDataSet die SQL-Select abfrage? Liege ich richtig mit meiner Vermutung, dass die DB-Struktur jedes mal neu bekannt gegeben werden muß?

      Danke Walte

      Comment


      • #4
        Hallo,

        ja - das ist der dahinterliegende Grund. Der InterBase verwendet eine Multigenerationen-Architektur, bei der jeder Benutzer in seiner Transaktion sogar eine eigene Tabellenstruktur erhalten kann (d.h. man darf die Struktur der Tabelle im laufenden Betrieb ändern). Daher muss IBX zur Sicherheit bei jedem Öffnen der Datenmenge nachfragen, wie die Struktur zur Zeit aussieht. Dies kann man zur Zeit nur umgehen, indem über TIBSQL die INSERT-Anweisung direkt abgeschickt wird (ohne das eine SELECT-Abfrage notwendig wird). Denn bei TIBSQL muss IBX die INSERT-Anweisung nicht generieren, sondern schiebt die Verantwortung auf uns Entwickler ab. Wer den Komfort von TIBDataSet ausnutzen will, muss dann im Gegenzug auch in den sauren Apfel des vorherigen SELECTs greifen. Mit der WHERE-Einschränkung 1=2 wird der "Apfel aber genießbar" :-

        Comment

        Working...
        X