Fragensteller
DataCombo-Box an DB anbinden

Frage
-
Hallo Zusammen,
benutze um Nummer, Name aus einer DB auszuwählen zwei DataCombos an die jeweils ein ADOB.Recordset (.RowSource) gebunden ist:
'Combo mit Nummer
With dcb_Obj_Nr
Set .RowSource = RS_Objekt_Nr
.TEXT = ""
.ListField = RS_Objekt_Nr.Fields(0).Name
.BoundColumn = RS_Objekt_Nr.Fields(1).Name
End With
'Combo mit BezeichnungenWith dcb_Obj_Bez
Set .RowSource = RS_Objekt_Bez
.TEXT = ""
.ListField = RS_Objekt_Bez.Fields(0).Name
.BoundColumn = RS_Objekt_Bez.Fields(1).Name
End WithGing bis vor Kurzem auch ganz gut. Inzwischen beinhaltet die Datenbank-Tabelle aber mehr als 35000 Sätze und die Reaktion der DataCombo beim Auswählen eines Elementes hat sich erheblich verlangsamt.
Gibt es eine schnellere Alternative dazu?
Sage jetzt schon mal vielen Dank für einen Tipp.
Alle Antworten
-
Hi Adam,
ich gehe jetzt mal davon aus das du VB6 verwendest und nicht .NET.
Wenn ich das jetzt richtig im Kopf habe ist ein direkter zugriff über ein SQL Kommando schon einiges schneller.
Ein andere Ansatz wäre die Anzahl der Datensätze zu Reduzieren z.B. über einen Filter. Ich denk mal die wenigsten Anwender wollen 35000 Datensätze bearbeiten.
Man kann sich natürlich auch eine Caching Strategie überlegen. Hier mal ein Link zu der Caching Guid von Microsoft, ist zwar für .NET aber ich denk es kann als Ansatz helfen.
Es besteht auch die Möglichkeit .NET Controlls in VB6 zu nutzen, hier könnte man dann z.B. ein DataGrid im Virtual Mode verwenden.
MFG
Björn -
Hallo Björn,
vielen Dank für Deine Antwort.
Es geht um VB6. Deine Vorschläge mit .NET scheinen mir sehr aufwendig.
Würde den eine Verbindung zur DB mit dem DataEnvironment
With DataCombo
Set .DataSource = DataEnvironment
End With
funktionieren?
Müsste dann eine zweite Anbindung an die DB erstellt werden, neben dem Jet-Zugriff?
Gruß
- Bearbeitet Adam Loch Donnerstag, 1. August 2013 14:46
-
Hi Adam,
vorweg ich bin jetzt kein VB6 Experte.
Wenn ich den Link richtig verstehe erzeugt DataEnvironment intern ein RecordSet.
Es wird dann dein Performance Problem auch nicht lösen.
Da ich jetzt nicht genau weiß, wie die Performance deiner Combobox ist und was so lange dauert, ist es schwer einen guten Rat zu geben.
Wenn alleine das laden der 35000 Datensätze zulange dauert, weil die Datenmenge so groß ist. Wirst du wohl nur eine bessere Performance bekommen in dem du die Datenmenge reduzierst. Ein paar Möglichkeiten hab ich ja oben schon vorgestellt.
Ansonsten gib vielleicht mal an, was mit den Datensetzen gemacht wird und was für Daten sie enthalten.
MFG
Björn
-
Hallo Björn,
über ein DataCombo mit Nummern und ein DataCombo mit den dazugehörenden Namen sollen Kunden aus einer Tabelle ausgewählt werden, für die neue Daten (Aufträge, Rechnungen usw.) erfasst werden oder vorhandene Erfassungen angezeigt werden.
Nummern und Namen werden im ersten Formular in dem die Auswahl benötigt wird in zwei RecordSet eingelesen und an die DataCombos angebunden. In den weiteren Formularen (üblicherweise ist immer nur ein Formular geöffnet) werden die RS nur an die DataCombos angebunden.
Die Reaktionszeit der DataCombos wird besser wenn die Anzahl der eingelesenen Sätze reduziert wird.
Gruß
-
Hi Adam,
meine Idee wäre jetzt wirklich nur Nummer und Name zu laden.
Falls das noch zu langsam ist, zwei Textboxen für Nummer und Name einfügen. Und die Daten erst laden wenn z.B. 3 Buchstaben beim Namen eingegeben sind und diese dann als Filter benutzen um die Anzahl der Datensätze zu reduzieren.
Eine andere Möglichkeit wäre direkt beim Start des Programms alle Datensätze zu laden (Cachen). Nummer und Name sollten sich nicht häufig andern. Dann bei der Anzeige nur neue Kunden nachladen, falls die Nummer fortlaufend ist sollte das kein Problem sein. Und wenn nun Details zum Kunden angezeigt werden, den Datensatz komplett aktualisieren. Falls der Kunde zwischenzeitlich gelöscht wurde könnte man hier eine Meldung einbauen.
Ist natürlich beides mit gewissen Aufwand verbunden.
Was die Reaktionszeit angeht, hast du mal geschaut wie lange das Laden mit eine SQL Commando und wie lange es mit einem RecordSet brauch.
MFG
Björn
-
Hallo Björn,
es werden nur Nummer und Name in 2 Recordsets geladen. Im ersten sortiert nach Nummern, dieser wird an DataCombo eins gebunden und im zweiten sortiert nach Namen für das DataCombo mit den Namen. Die DataCombos sind verknüpft, so dass bei der Auswahl einer Nummer der passende Namen angezeigt wird - und umgekehrt beim Namen die Nummer.
Das Laden ist annehmbar. Die hohe Anzahl der Sätze in den Recordset verlangsamt die DataCombos und das stört:
Wenn z.B. "T" eingegeben wird "dauert" es bis die Namen die mit T beginnen erscheinen, oder wenn auf ein Element geklickt wird dauert es, bis es im .Text der DataCombo angezeigt wird, oder das Bewegen mit der Pfeiltaste in der aufgeklappten Liste stoppt manchmal.
Werde die Anzahl der Sätze die in die Recordset gelesen werden reduzieren. Auch habe ich festgestellt, daß dann das Programm im Allgemeinen schneller wird.
Schön wäre es, wenn ich eine Lösung ohne Recordsets, d.h. "direktes" Anbinden der DataCombo an die DB finden würde.
Gruß