Announcement

Collapse
No announcement yet.

Delhphi5-Abfrage mit TQuery und ADO-Treiber der BDE

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

  • Delhphi5-Abfrage mit TQuery und ADO-Treiber der BDE

    Problem: Wird die abgefragte Datenmenge z.B. in einem Grid dargestellt funktioniert die Scrollbar nicht richtig. Auch die Methode FetchAll bringt keinen Erfolg.

  • #2
    Hallo,

    was ist mit <i>"funktioniert die Scrollbar nicht richtig"</i> gemeint? In meinem Beispiel (Zugriff auf eine <b>SQL Server 7</b>-Datenbank über <b>TADOQuery</b> hat die Scrollbar im DBGrid die folgenden Eigenschaften: <br>
    - Höhe der Scrollbar-Button ändert sich je nach Datensatzanzahl (je mehr Datensätze in der Tabelle sind, umso schmaler ist der Button) <br>
    - Position des Scrollbar-Button entspricht der aktuellen Datensatzposition (gleitende Positionierung). <br>
    - Wird der Scrollbar-Button mit der Maus neu positioniert, ändert sich auch der aktuelle ausgewählte Datensatz.
    <pre>
    object Form1: TForm1
    Left = 192
    Top = 107
    Width = 696
    Height = 480
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object DBGrid1: TDBGrid
    Left = 24
    Top = 64
    Width = 465
    Height = 81
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object DBNavigator1: TDBNavigator
    Left = 152
    Top = 32
    Width = 240
    Height = 25
    DataSource = DataSource1
    TabOrder = 1
    end
    object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
    'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initi' +
    'al Catalog=OSSISOFT;Data Source=(local);Locale Identifier=1031;C' +
    'onnect Timeout=15;Use Procedure for Prepare=1;Auto Translate=Tru' +
    'e;Packet Size=4096;Workstation ID=SOLO9150'
    Mode = cmShareDenyNone
    Provider = 'SQLOLEDB.1'
    Left = 24
    Top = 24
    end
    object DataSource1: TDataSource
    DataSet = ADOQuery1
    Left = 104
    Top = 24
    end
    object ADOQuery1: TADOQuery
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    Parameters = <>
    SQL.Strings = (
    'SELECT * FROM kunden')
    Left = 64
    Top = 24
    end
    end
    </pre&gt

    Comment


    • #3
      Hello,
      Besten Dank für den Tip. Mein Problem entsteht aber bei einer Verbindung mittels BDE und SQL-Treiber oder auch mit ODBC. Die Scrollbar hat dann eine feste Breite, und drei feste Stellungen: Anfang, Mitte und Ende

      Comment


      • #4
        Hallo,

        in diesem Fall wird aber <b>keine</b> ADO-Verbindung verwendet, so das die Frage etwas missverständlich formuliert war. Für eine BDE-Datenmenge ist das geschilderte Verhalten (3 feste Stellungen) völlig normal. Warum das so ist (d.h. welche Beweggründe die VCL-Väter damals hatten) habe ich in diesem Forum vor einigen Wochen erst beantwortet

        Comment


        • #5
          <br>@A.Kosch:
          <br>
          <br>Hallo,
          <br>
          <br>bei meiner Suche nach Problemlösungen bin ich in Ihrem Buch "Client/Server Datenbankentwicklung mit Delphi" auf einen eigenartigen Screenshot gestoßen.
          <br>Auf Seite 169 wird ein Screenshot der Funktionsdatenbank gezeigt, bei dem die Scrollbar nicht nur drei feste Stellungen hat. Die Komponente mit der Scrollbar scheint ein ganz normales DBGrid zu sein und offenbar wurden nur BDE Komponenten verwendet (keine ADO).
          <br>
          <br>1) Wie haben Sie denn das hier mit der ScrollBar hinbekommen?
          <br>
          <br>"Warum das so ist (d.h. welche Beweggründe die VCL-Väter damals hatten) habe ich in diesem Forum vor einigen Wochen erst beantwortet."
          <br>2) Finde diese Diskusion nicht. Unter welchem Stichwort muß ich suchen?
          <br>
          <br>MfG
          <br>P

          Comment


          • #6
            Hallo,

            ich bin erst heute von den <i>Entwickler Tagen 2001</i> zurückgekommen und kann daher erst so spät auf die Frage antworten:

            zu Frage 1: <br>
            Das Beispielprogramm <i>Funktionsdatenbank</i> verwendet eine <b>Paradox</b>-Datenbank. Und bei einer datensatzorientierten Desktopdatenbank wie Paradox (oder dBASE oder ACCESS) kann die BDE die exakte Datensatzposition berechnen, so dass es einen <b>Datensatz-Zeiger</b> gibt. Somit kann auch ein TDBGrid auf diese exakte Information zurückgreifen.

            zu Frage 2: <br>
            Eine SQL-Datenbank arbeitet <b>mengenorientiert</b> (und nicht datensatzorientiert wie Paradox etc.). In einer Menge ist die Position eines bestimmten Eintrags nicht exakt bestimmbar. Außerdem muss der Client (Programm) jeden Datensatz erst bei Bedarf vom Server (SQL-Datenbank) abfordern. Wenn der Benutzer nicht bis zum letzten Datensatz durchblättert, hat der Client keine Ahnung, wieviele Datensätze noch abzuholen sind. Daher stehen der VCL (und somit dem TDBGrid) nur 3 exakte Werte zur Verfügung: <br>
            1. Erster Datensatz (BOF) <br>
            2. Letzer Datensatz (EOF) <br>
            3. Wenn nicht BOF oder EOF vorliegt, muss ich irgendwo in der Mitte sein ;-)

            Aus Performancegründen verzichtet TDBGrid bei einer SQL-Datenbank daher darauf, die exakte Position zu bestimmen (denn muss müsste auf jeden Fall die komplette Ergebnismenge vom Server geholt werden, auch wenn diese Datensätze niemals im DBGrid angezeigt werden)

            Comment


            • #7
              <br>Danke!
              <br>
              <br>D. h. wenn ich mit ADO Komponenten arbeite, die mir alle Positionen in der Scrollbar anzeigen, ist das langsamer, da zu nächst alle Daten eingelesen werden?
              <br>
              <br>mfg
              <br>p

              Comment


              • #8
                Hallo,

                ja - es <b>kann</b> langsamer sein. ADO unterstützt jedoch das asynchrone Laden im Hintergrund, indem dazu automatisch ohne jedes Zutun des Entwicklers ein separater Thread abgespaltet wird. In diesem Fall wird der primäre Thread (Benutzeroberfläche) nicht behindert (d.h. die ersten Datensätze werden im TDBGrid sofort angezeigt), da das Nachladen aller Datensätze im Hintergrund passiert. Über Ereignisse kann sich das Programm vom Ende des Ladevorgangs informieren lassen

                Comment

                Working...
                X