Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 100 x Fieldvalue durch Fieldbyname erstetzen? (https://www.delphipraxis.net/65907-100-x-fieldvalue-durch-fieldbyname-erstetzen.html)

Karstadt 22. Mär 2006 08:57

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)

Elvis 22. Mär 2006 09:32

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.

Union 22. Mär 2006 09:34

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).

Thanatos81 22. Mär 2006 09:37

Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
 
Naja, zwei Vorteile gibt es für FieldByName IMHO doch:
  1. Der Code ist lesbarer, und dadurch leichter zu warten
  2. Falls die selbe Komponente nicht immer exakt die gleiche Feldreihenfolge hat, greifst du immer auf das "richtige" Feld zu

Ulf346C 22. Mär 2006 09:44

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;

Elvis 22. Mär 2006 09:50

Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
 
Zitat:

Zitat von Thanatos81
Naja, zwei Vorteile gibt es für FieldByName IMHO doch:
  1. Der Code ist lesbarer, und dadurch leichter zu warten
  2. Falls die selbe Komponente nicht immer exakt die gleiche Feldreihenfolge hat, greifst du immer auf das "richtige" Feld zu

Als Anhänger von OO-Abbildung von DBs finde ich das Argument "Lesbarkeit" in Kombination mit DataSets mehr als fehl am Platz. ;)
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

Karstadt 22. Mär 2006 11:49

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)

alzaimar 22. Mär 2006 12:17

Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
 
Zitat:

Zitat von Union
Eine andere Lösung wäre das Generieren benannter TField-Objekte zur Laufzeit oder persistent. Das liegt in der Geschwindigkeit zwischen FieldByName und FieldIndex

Nein. Persistente Felder sind die schnellste Zugriffsmöglichkeit. Per Index ist es um ca 1.5 langsamer, mit Feldnamen ca. 10x.

Zitat:

Zitat von Elvis
Als Anhänger von OO-Abbildung von DBs finde ich das Argument "Lesbarkeit" in Kombination mit DataSets mehr als fehl am Platz. ;)

Was hat denn OO mit einer Tabelle zu tun? Wer hier feine Objektserialisierung implementiert, hat ein Rad ab.
Zitat:

Zitat von Elvis
[1]das alles nur um den SQL Text in irgendeinem Form/Frame/DM-Designer tippen zu können

Nein. Und das Alles nur, um Programme zu schreiben, die schnell, robust und wartbar sind. Das gelingt Dir mit OO in Zusammenarbeit mit der Visualisierung von Tabellen nämlich nicht (also robust und wartbar: Ja, schnell: Nein). :mrgreen:

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.

Karstadt 22. Mär 2006 12:29

Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
 
Dann muss ich aber ein Procedur Programmieren:

Delphi-Quellcode:

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;
So ungefähr sollte das aussehen. ist aber etwas aufwendig.

Karstadt 22. Mär 2006 12:34

Re: 100 x Fieldvalue durch Fieldbyname erstetzen?
 
Zitat:

Persistente Felder sind die schnellste Zugriffsmöglichkeit. Per Index ist es um ca 1.5 langsamer, mit Feldnamen ca. 10x.
Wie kommst du auf diese Ergebnisse?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz