AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Möglicher Fehler in GetTableName

Ein Thema von Neutral General · begonnen am 8. Dez 2014 · letzter Beitrag vom 8. Dez 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 12:42
Ok, verstanden (dann wäre eine Antwort zwar nicht korrekt, aber unwichtig).

Man kann bei einer Typ-2-Grammatik keinen nichthierarchischen Parser verwenden. Oder einfacher ausgedrückt: Die Sprache ist rekursiv formuliert (Queries können Queries beinhalten, es gibt Klammerebenen), also muss man einen Satz der Sprache (das 'SQL-Statement') auch rekursiv analysieren. Es reicht natürlich ein Stack, aber der ist ja auch rekursiv.

Ob sich das Problem mit RegEx lösen lässt, weiß ich nicht. Rein theoretisch nicht, denn RegEx kann 'eigentlich' nur Typ-3 Grammatiken parsen, aber mit dem ganzen Lookahead-Gedöns und dem bilden von Gruppen wäre es theoretisch denkbar, obwohl... nee. geht nicht (meine Meinung )

Jedenfalls geht es nicht so. Garantiert nicht. Um es richtig zu machen, musst du einen Parser schreiben, der die kompletten SELECT-Syntax implementiert und dann im aufgespannten Syntaxbaum beim 'äußeren' FROM-Knoten nachschauen: Dort hängen dann die JOIN-Operatoren mit den in Frage kommenden Tabellen. Allerdings ist es ja so, dass die Veränderung nicht über eine Tabelle läuft, sondern über viele, d.h. alleine schon das Funktionsresultat "der Tabellenname" ist falsch, es müsste "die Tabellennamen" heißen und pro Feld angegeben werden.

Tipp: SQL-Server kann direkt auf einer View Operationen (DELETE, INSERT, UPDATE) ausführen. Andere RDBMS können das vielleicht/vermutlich auch. Wenn als *das* dein Problem ist, packe deine Query in eine View und führe das Update einfach auf der View aus.

Ansonsten bin ich persönlich kein Verfechter von 'Ich verstehe die Query und baue Dir ein INSERT draus'. Das geht nämlich manchmal auch in die Hose. Besser ist es, die DML explizit auszuformulieren.

Aber vermutlich ist das eh nicht dein Problem.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 13:56
Den ersten Tabellennamen vom äußersten FROM ...
SQL-Code:
select
  *
from
  ( select * from tab1 )
Es wird schwierig immer den richtigen Tabellennamen zu treffen und aufzulösen.

Darum ist es auch besser, die Statements eben nicht automatisch generieren zu lassen. Den Aufwand den man damit betreibt um auch wirklich alle Ausnahmen zu berücksichtigen schmeisst man wieder in die Tonne, wenn die nächste noch unberücksichtigte Ausnahme kommt. Irgendwann ist man es leid.

Da baue ich mir doch lieber ein Repository und arbeite mit Objekten, oder meinetwegen auch eine DataSet-Factory, die mir die passenden Abfrage-Instanzen liefert.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 14:15
..lieber ein Repository..
Dazu noch der Hinweis, dass selbest das "richtige" finden des Tabellennamens u.U. nicht das Ende der Fahnenstange ist. Werden hier nur Spalten aus der Update Table selektiert, ist vielleicht alles im grünen Bereich, sind aber Werte aus anderen Tabellen in den Ausgabespalten dabei(soll ja vorkommen), dann kann man die nicht updaten, zumindest nicht auf Basis einer Update Table.

Im Repository würde man also nicht nur die Table, sondern vielleicht auch die Spalten mitverwalten.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 14:29
..lieber ein Repository..
Dazu noch der Hinweis, dass selbest das "richtige" finden des Tabellennamens u.U. nicht das Ende der Fahnenstange ist. Werden hier nur Spalten aus der Update Table selektiert, ist vielleicht alles im grünen Bereich, sind aber Werte aus anderen Tabellen in den Ausgabespalten dabei(soll ja vorkommen), dann kann man die nicht updaten, zumindest nicht auf Basis einer Update Table.

Im Repository würde man also nicht nur die Table, sondern vielleicht auch die Spalten mitverwalten.
Wieso denn jetzt Spalten mitverwalten?

Meine Repositories sehen ungefähr so aus
Delphi-Quellcode:
type
  TFooId = type Integer;
  TFooIdHelper = record helper for TFooId
    const
      null = 0;
  end;

  TFoo = class
  public
    constructor Create( Id : TFooId; const Title : string );
    property Id : TFooId read Fid;
    property Title : string read FTitle;
  end;

  IFooRepository = interface
    function Get( FooId : TFooId; out Foo : TFoo ) : Boolean;
    function GetAll : TArray<TFooId>;
    function Store( Foo : TFoo; Dispose : Boolean = False ) : Boolean;
    function NextFooId : TFooId;
  end;
Das Repository weiß, wo die Informationen gespeichert werden und eben auch, wo es die Informationen wieder holen kann (da wo man auch speichert?). Das Repository hat dann x Abfrage-Objekte und leitet die Anforderungen durch diese hindurch.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 8. Dez 2014 um 14:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 14:32
Leute ihr driftet total ab.

Es ist jetzt total egal ob man sich irgendwelche Statements generieren lassen sollte oder nicht oder welche Alternativen es dazu gibt.

Die Frage ist: Ist das ein Fehler in der RTL?
Sollte diese Funktion in dem von mir genannten Fall nicht "TABELLE1" statt "TABELLE_INNEN" zurückgeben?

Alles andere ist vollkommen irrelevant.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#6

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 15:10
Die Frage ist: Ist das ein Fehler in der RTL?
Sollte diese Funktion in dem von mir genannten Fall nicht "TABELLE1" statt "TABELLE_INNEN" zurückgeben?
Gibt es denn irgendwo eine Beschreibung, was die Funktion GetTableNameFromSQLEx bei bestimmten Eingabeparametern zurückliefern soll? Eine vollständige semantische Analyse des SQL-Statements kann man da wohl eher nicht erwarten.

Bei FireDAC ist das zumindest so gelöst, daß man über UpdateOptions.UpdateTableName den Namen angeben kann und sogar muss, wenn "FireDAC den Namen der zu aktualisierenden Tabelle nicht korrekt aus der Abfrage abrufen kann." Dabei ist es ziemlich unerheblich, warum FireDAC das nicht kann, weil der entsprechende Algorithmus vielleicht nur für simple SELECT-Anweisungen funktioniert. Ich habe jetzt die erwähnten DA-Komponenten nicht greifbar, aber vielleicht gibt es da ja einen ähnlichen Mechanismus.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 15:15
Leute ihr driftet total ab.

Es ist jetzt total egal ob man sich irgendwelche Statements generieren lassen sollte oder nicht oder welche Alternativen es dazu gibt.

Die Frage ist: Ist das ein Fehler in der RTL?
Sollte diese Funktion in dem von mir genannten Fall nicht "TABELLE1" statt "TABELLE_INNEN" zurückgeben?

Alles andere ist vollkommen irrelevant.
Ok, sorry für so viel Drift!
Solange keiner weiß, was die Funktion machen soll, kann das keiner beantworten.
Gruß, Jo
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Möglicher Fehler in GetTableName

  Alt 8. Dez 2014, 16:37
Es wird schwierig immer den richtigen Tabellennamen zu treffen und aufzulösen.
Unabhängig davon, das so ein Automatismus wirklich beknackt ist, glaube ich, das der SQL-Server das auflösen kann, denn er weiß ja durch den Queryplan genau, welche Tabelle er für welches Feld referenzieren muss. Und wenn keine Aggregate in der Query sind und sich alle Spalten der View direkt auf Spalten einer Tabelle abbilden lassen, sollte er das auch auflösen können. Deshalb kann man so eine schöne Systemgrenze ziehen, indem die Anwendung einfach nur 'Tabellen' beackert: Ob das Views sind und aus anderen tabellen zusammengepopelt wurde, ist egal. Ich kann mir auch Instead-of-Trigger bauen, als Alternative zu ORM und alles-im-Delphi-Code. Das ist vor allen Dingen dann besser, wenn ich häufig Massenupdates habe, à la "update meineView set Feld='Bar' where anderesFeld='Foo'"

Ok, sorry für so viel Drift!
Damned, das war doch eben noch nicht da

Alles klar: Zurück zum Thema: JA ein Bug (sagte ich bereits).

Geändert von Dejan Vu ( 8. Dez 2014 um 16:39 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 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