![]() |
Datenbank: MYSQL • Version: 4.1 • Zugriff über: Direkt
100 x Fieldvalue durch Fieldbyname erstetzen?
Hallo.
Bearbeite einen bestehenden Projekt. Soll ich 100 x Fieldvalue durch Fieldbyname erstetzen? Was bringt mir das? Kann ich bei jeden Feldtyp mit Fieldbyname().asstring arbeiten (Feldinhalt wird schon richtig sein) |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
FieldByName bringt dir nichts bis gar nix, außer dass es lahmer ist.
Wenn du direkt auf den Index gehst ersparst du hier den ersten Schritt: Name -> Index -> Wert. |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Hallo,
dies solltest Du auf jeden Fall ändern. Zugriffe über Feldindexe sind zwar schneller als FieldByName, aber gefährlich. Denn wenn sich die uzugrunde liegende Datenmenge ändert (z.B. ein neues Feld im SELECT einer Query oder Strukturerweiterung oder Verscheieben der persistenten Felder in der Feldliste), greifst Du ja auf ganz andere Felder zu als erwartet. Eine andere Lösung wäre das Generieren benannter TField-Objekte zur Laufzeit oder persistent. Das liegt in der Geschwindigkeit zwischen FieldByName und FieldIndex, aber ist die sicherste Methode, da Dir schon der Compiler nicht vorhandene Felder meldet. Mit FieldByName kannst Du Dich ja immer noch beim Feldnamen vertippen. Und zu Deiner zweiten Frage: Eigentlich unterstützen fast alle Feldtypen AsString. Nur bei Zuweisungen solltest Du damit vorsichtig sein, denn manche Strings können nicht umgewandelt werden (oft Floatfelder). |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Naja, zwei Vorteile gibt es für FieldByName IMHO doch:
|
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Du greifst über die Spaltennummer zu :eek:
In einer SQL-Umgebung (und nicht nur da) ist es schon angebracht, die Datenfelder über den Feldnamen anzusprechen. Sonst nimmst du dir die Möglichkeit, z.B. an der Struktur der Tabelle nachträglich etwas verändern zu können. bei MySQL kann man im Prinzip alles per .asString machen. Die reine Lehre ist das aber nicht. Delphi bietet die viel schönere Variante .asVariant, die ist in jedem Fall zu bevorzugen, wenn deine SQL-Implementation das unterstützt. Mit ZEOS geht das. Wenn du einigermaßen Bombensicher Datensätze kopieren willst ohne die Feldnamen zu verwenden, nimm
Delphi-Quellcode:
var i: integer
t: string; for i := 0 to (tabelle1.fieldcount -1) do begin t := tabelle1.fields[i].fieldname; if not (tabelle2.findfield(t) = nil) then tabelle2.fieldbyname(t).asVariant := tabelle1.fieldbyname(t).asVariant end; |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Zitat:
Einen String reinzuschmeißen, die Spalten suchen zu lassen nur um mit dem resultierenden Index endlich den Wert bekommen zu kommen,[1] klingt für mich nach (sorry) VB-Monk-Taktik. [1]das alles nur um den SQL Text in irgendeinem Form/Frame/DM-Designer tippen zu können |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Die meinungen gehen sehr weit auseinander :(
Auf jeden Feld ein index zu setzen ist doch nicht sinnvoll! und as asVariant soll das langsammer sein als asString weil der Typ bei Variant nicht bestimmt ist. die Frage ist soll ich die zwei Stunden investieren oder lieber so lassen wie das ist. Lesbar ist das auch. (Fieldvalue) |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Zitat:
Zitat:
Zitat:
Und nur weil ich eine Sprache habe, die es mir erlaubt, OOP zu betreiben, muss ich das ja nicht immer und überall anwenden. Merke: Verwende immer die Technik, die für die Aufgabe am Besten geeignet ist. |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Dann muss ich aber ein Procedur Programmieren:
Delphi-Quellcode:
So ungefähr sollte das aussehen. ist aber etwas aufwendig.Procedure SchreibeDaten(Tabelle, Feld, Feldinhalt) var i: integer t: string; begin for i := 0 to (Tabelle.fieldcount -1) do begin t := Tabelle.fields[i].fieldname; If t:= Feld then begin Tabelle.fieldbyname(t).asVariant := Feldinhalt; break; end; end; |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Zitat:
|
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Nachgemessen, wie sonst? :zwinker:
hab hier grad ein Projekt, mit einer TTable. Im AfterOpen einfach drei Schleifen gebaut: 1.Schleife: Alle Felder per index durchiterieren und auf den Inhalt zugreifen 2.Schleife: Alle Persistenten Felder durchiterieren und ditto 3.Schleife: Alle Felder per Feldnamen durchiterieren. Aber war quick and dirty. Das Verhältnis zwischen (3) und (1) ist auch nicht konstant 10x, sondern wächst mit der Anzahl der Felder (logisch, weil linear gesucht wird). |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Hallo,
wenn ich richtig lesen kann, geht es um den Vergleich von FieldValues und FieldByName der Methode TDataSet. Wo ist denn da ein Zugriff über einen Index? Beide erwarten als Parameter den FeldNamen als String. Nur das FieldValues Variants benutzt und damit noch die Typumwandlung machen muss. Deshalb ist für mich FieldByName die bessere Wahl. Aber ein bestehendes Projekt dahingehend umzustellen halte ich nicht für sinnvoll. Beides funktioniert und eine bemerkbare Performancesteigerung werd ich damit nicht erreichen. Cu, Frank |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Nein:
Wie greifen wir auf Felder zu? 1. MyTable.Fields[10].AsString .... Mist, weil fehleranfällig. 2. MyTableThe10thField.AsString .... Schnell, sicher aber unflexibel. 3. MyTable.FieldByName('The10thField').AsString ... Ok, aber lahm 4. MyTable['The10thField'] .... Wie 3. |
Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
Habe gestern experementiert...
150 Felder 4000 DS mit Filebyname gearbeitet (jeden feld angesprochen dauer 3 sekunden) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz