Problem: Wird die abgefragte Datenmenge z.B. in einem Grid dargestellt funktioniert die Scrollbar nicht richtig. Auch die Methode FetchAll bringt keinen Erfolg.
Announcement
Collapse
No announcement yet.
Delhphi5-Abfrage mit TQuery und ADO-Treiber der BDE
Collapse
X
-
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>
-
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
-
<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
-
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
-
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
Comment