AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha
Thema durchsuchen
Ansicht
Themen-Optionen

MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha

Offene Frage von "EgonHugeist"
Ein Thema von bdg · begonnen am 5. Nov 2012 · letzter Beitrag vom 19. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2      
bdg

Registriert seit: 19. Mär 2007
7 Beiträge
 
#1

MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha

  Alt 5. Nov 2012, 16:50
Datenbank: MySql • Version: 3 • Zugriff über: Zeos6.6
Hallo,
Ich habe Programme mit Delphi5 MySql3 und Zeos5.3 erstellt und möchte nun auf Zeos 6.6 umstellen.

ich habe ein Edit/Post-Problem.


Beispiel :
Query.Sql.Text := 'Select ' +
' firma.FirmenNr, firma.Name1, Firma.Name2, ' +
' Ansprechpartner.Vorname,Ansprechpartner.Nachname ' +
' from firma ' +
' left join Ansprechpartner on firma.FirmenNr=Ansprechpartner.FirmenNr '
....
Query.Edit
Query.FieldByName('Name1').AsString := 'Test';
Query.Post;


Es kommt die Meldung :
'Can not update a complex query with more than one table'
Das passiert auch bei Append/Insert / Post.

Sobald ein LeftJoin / mehr als 1 Tabelle im Sql enthalten ist, geht das Schief mit Zeos6.6

Es ist mir klar dass ein Edit/Post auf LeftJoinFelder nicht geht.
Das geht weder bei Zeos5.3 noch bei Zeos6.6

Bei Zeos5.3 geht Edit/Append bei Felder, die auf die "FROM"-Tabelle verweisen.
Bei Zeos6.6 geht das nicht ((

Ich hab mal die Zeoskomponenten durchdebugged.
Es gibt da eine Stelle wo von allen Feldern des Sql, die Tabellen-Namen ermittelt werden.
Sobald dort ein 2. (Left-Join-)Tabellename auftaucht, wird mit der obigen Fehlermeldung abgebrochen!
( Also es wird nicht mal versucht, den Post durchzuführen !

Hat da jemand Abhilfe ???
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 6. Nov 2012, 00:38
Meine Güte 6.6.6 ist schon veraltet. Nimm die 7er.

Also das Problem (Buggy verhalten), welches du hier ansprichst, wurde aus gutem Grund unterbunden. Diverse Felder wurden falsch parameterisiert und updates mit joins führen wahrlich nur zu Problemen, da keine eindeutigen MetaDaten gelesen werden können. Somit können default/autoinc-values, primary-keys usw. nicht eindeutig identifiziert werden.

Um den Problem in alter Gewohnheit abzuschaffen, soltest du einfach noch die TZSQLUpdate Komponente einbeziehen. Lege da die nötigen Parameter an und du kannst jede X:N:R Relation updaten...

Gruß, Michael

Frage MySQL 3? Seh ich das richtig? Und welchen Compiler nimmst du? Zeos7 unterstütz nur noch D7-XE3/FPC2.4-2.7

Geändert von EgonHugeist ( 6. Nov 2012 um 00:40 Uhr) Grund: Compiler?
  Mit Zitat antworten Zitat
bdg

Registriert seit: 19. Mär 2007
7 Beiträge
 
#3

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 6. Nov 2012, 09:25
Hallo,
das bringt mir nicht viel.

Sqls absetzen das geht auch so,das wäre nicht das Problem.

Das Problem ist dass bei diesen Querys auch TDBedit-Objekte oder Grids gebunden sind, und somit keine Änderung mehr möglich wäre !

Somit müsste ich alles umschreiben und per Sql-Befehle updaten !
Bei einem Projekt mit mehreren 100.000 Zeilen ist das sehr aufwendig !

Oder hab ich da was falsch verstanden mit der TZSqlUpdate-Komponente ???

Die gab es in der Zeos5.3 nicht.
So wie ich weiss, setzt die einfach nur Sqls ab .


Ich will ja keine Jeft-Join-Felder updaten sondern nur die "FROM"-Felder, so wie es eben jetzt schon ist (Zeos5.3)

Geht das denn mit dem Zeos7 komponenten ??
Ich hab Delphi5 , so wie ich oben sehen gehen die Zeos7-Komponenten erst ab D7


Also: Meine Aufgabe ist es ein Projekt in ( Delphi5 / MySql3 /Zeos5.3 ) umzustellen
zuerst auf Mysql5 ( dafür brauch ich die Zeos6.6 Komponenten, da die 7er erst ab Delphi7 gehen)
Wenn das dann soweit ist, dann von Delph5 auf Delphi XE

Geändert von bdg ( 6. Nov 2012 um 09:49 Uhr)
  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: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 6. Nov 2012, 09:52
Dann lass doch die JOINs raus und erstelle dir LookupFelder, das sieht dann genauso aus und du kannst trotzdem updaten wie gewohnt.
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
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 7. Nov 2012, 02:14
Dann lass doch die JOINs raus und erstelle dir LookupFelder, das sieht dann genauso aus und du kannst trotzdem updaten wie gewohnt.
Wäre auch eine Möglichkeit. Jedoch sind die Lookups je nach Datenmenge eeeettttwwaasss lllaaannngsam.

Oder hab ich da was falsch verstanden mit der TZSqlUpdate-Komponente ???
Jap hatte jedoch den falschen Namen: TZUpdateSQL heist die Komponente und diese sollte auch schon mit 6.6.x verfügbar gewesen sein.

Die gab es in der Zeos5.3 nicht.
So wie ich weiss, setzt die einfach nur Sqls ab .
Keine Ahnung was es unter 5.3 gab oder nicht...
Jedoch Setzt die Komponente keine "eigenen" Sql's ab. Dort kannst du, wenn verlinkt mit TZQuery, die Parameter und deren Typ definieren. Du könntest die Datenbank quasi mit TZConnection.UseMetadata = False öffnen (ohne Meta-> rasend schnell) jedoch kann Zeos dann nicht wissen, welche Felder beschreibbar sind. Dafür gibt es diese Komponente.

"insert into Foo values(:Bar);" sollten den Parameter 'Bar' in der Kompo hervorrufen, welcher dann je nach Typ die Daten intern zusammenbastelt. Und so wie ich das sehe, unterstützt MySQL 3.x keine Prepared-Statements. Von daher verstehe ich deinen Einwand gerade nicht. Bin mir relativ sicher, das alles mit Strings gesendet wird.

Teste as einfach mal. Kann die jedoch nicht sagen, ob das alles mit dieser UraltDB+Zeos7 hinhaut.
  Mit Zitat antworten Zitat
bdg

Registriert seit: 19. Mär 2007
7 Beiträge
 
#6

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 9. Nov 2012, 11:11
Also :
Zu : "UraltDB" ecc ecc
ja richtig, das ist ja meine Aufgabe, das ganze auf einen neueren Stand zu bringen. Das dies eine Uraltdb ist weiss ich auch

Zeos 7 kann ich leider nicht verwenden, da die für Delphi NUR AB VERSION 7 gehen und das Programm in Delphi 5 geschrieben ist.

ZUpdate habe ich nachgeschaut, gibt es auch in Zeos5.3, habe ich aber noch nie gebraucht
SqlStatements in die ZSqlUpdate-Componente zu hinterlegen und diese dann mit den Querys zu verbinden
ist aufwendiger als überall "Query.Edit" mit Sql-Anweisungen zu ersetzten.
Ferner ist es für Fehlersuche ecc besser wenn eine Sql-Anweisung in der PAS drin steht als in der komponente(dfm)

Ich werde es dann wohl so machen

Um nochmal auf das Problem zu kommen :
http://www.lazarusforum.de/viewtopic...=6132&start=15

Dort ist der Code der das ganze blockt notiert

{**
Defines a table name from the select statement.
}
function TZGenericCachedResolver.DefineTableName: string;
var
I: Integer;
Temp: string;
begin
Result := '';
for I := 1 to Metadata.GetColumnCount do
begin
Temp := ComposeFullTableName(Metadata.GetCatalogName(I),
Metadata.GetSchemaName(I), Metadata.GetTableName(I));
if (Result = '') and (Temp <> '') then
Result := Temp
else if (Result <> '') and (Temp <> '') and (Temp <> Result) then
raise EZSQLException.Create(SCanNotUpdateComplexQuery);
end;
if Result = '' then
raise EZSQLException.Create(SCanNotUpdateThisQueryType);
end;

was passiert hier ?!?!?!?

Hier mein Besipiel-SQL

Query.Sql.Text := 'Select ' +
' firma.FirmenNr, firma.Name1, Firma.Name2, ' +
' Ansprechpartner.Vorname,Ansprechpartner.Nachname ' +
' from firma ' +
' left join Ansprechpartner on firma.FirmenNr=Ansprechpartner.FirmenNr '

Es wird jedes Feld mit den Tabellennamen versehen ( bei mir ist er schon drin ).
Beim durchlaufen der Felder , ' firma.FirmenNr, firma.Name1, Firma.Name2, ' passiert noch nichts
erst dann wenn " Ansprechpartner.Vorname" kommt merkt er das ist ein 2.Tabellenname
und nun brech ich ab mit "Can not update a complex query with more than 1 table"


Eine Lösung gibt es wohl nicht,
man könnte versuchen, an dieser Stelle die Function so umzuschreiben, das die schleife nicht durchläuft, aber eine bestehende komponente zu überarbeiten, ohne zu wissen, was denn an anderen stellen noch passieren kann ist nicht ratsam (((

Deswegen :
Ich stell mal alle Query.Edits/Append/Insert/Delete um auf Sql-Anweisungen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 9. Nov 2012, 11:54
Mit Delphi 5 auf einen neuen Stand bringen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
bdg

Registriert seit: 19. Mär 2007
7 Beiträge
 
#8

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 9. Nov 2012, 13:08
Hallo,
ja
1.) delphi5 Mysql3 Zeos5.3 auf Delphi5 / Mysql3 / Zeos6.6
2.) delphi5 Mysql3 Zeos6.6 auf Delphi5 / Mysql5 / Zeos6.6
3.) delphi5 Mysql5 Zeos6.6 auf DelphiXE / Mysql5 / Zeos6.6 oder sogar 7

Oder wie würdest du ca. 1,5 Mio Zeilen Sourcecode umstellen ???
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 9. Nov 2012, 14:55
Genau so wie 1500 Zeilen Code: Auf Delphi nicht unter 2009, aktuellstes Zeos (oder besser gleich UniDAC), und die aktuelle MySQL. Wenn die Codebasis nicht völlig ungeschickt (ums nett zu sagen) gebaut ist, sollte die Menge an Stellen an denen man drehen muss ziemlich gering ausfallen. Für das Gros an Arbeiten vielleicht 2, maximal 3 Manntage, dann noch gründlich durchtesten und Kleinigkeiten bereinigen - in einer Woche (gerechnet in reiner Arbeit am Code) hast du das Ding spätestens entstaubt und bist zumindest wieder ein wenig zukunftsfähig.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 9. Nov 2012 um 14:58 Uhr)
  Mit Zitat antworten Zitat
bdg

Registriert seit: 19. Mär 2007
7 Beiträge
 
#10

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more

  Alt 9. Nov 2012, 15:49
Hallo,
ne ne das geht nicht so einfach wie du dir das vorstellst. letzenendes hab ich noch ein paar hundert Kunden, bei denen das installiert ist und mal auf die schnelle eine DB umstellen geht nicht so einfach
ABER :
Unidac scheint ein guter Tip zu sein .
Hab mal ein bisschen nachgeschaut.
Mal davon abgesehen, dass UniDAC ab Delph5 geht und ab MySql3 geht, scheint mir das neuer und kompatibler zu sein als Zeos, da so wie ich weiss Zeos 7 ja auch schon seit langem nicht mehr gepflegt wird !
d.h. auf mich zugeschnitten :
Delphi5 / MySql3 / Zeos53 auf Delphi5/MySql3/UniDac scheint mir sinnvoller zu sein, da UniDac auch noch
mit DelphiXE funktioniert!
Danach kann ich dann mit den gleichen Komponenten auf MySql5 umstellen und danach alles nehmen und mit DelphiXE compilieren ( einfach gesagt )

Kann mir jemand etwas mehr Info geben bzg. UniDac ???
So wie ich verstanden habe ( gesehen habe) arbeitet es genaus so wie Zeos. es verlangt nach einer LibMySql.dll

Weiss zufällig jemand ob auch eine LibMySql5.dll geht ???

Es ist so, mein Projekt hat mehrere EXE-Dateien.
Zeos5.3 greift auf einer LIBMYSQL.DLL zu ( das geht nicht anders) .
Zeos6.6 kann auf mehrere LibMysqlxx.DLL zugreifen ( libmysql.dll, libmysql40.dll, libmysql50.dll libmysql51.dll)
Ich habe eine LIBMYSQL.DLL von der MySql5.5 genommen und in libmysql51.dll umbenannt.
ALLE MEINE EXE-Dateien liegen in einem Ordner. inkl. libmysql.dll ( für Zeos5.3-Exe) und libmysql51.dll für Zeos66-Exe)


Denn ob ich nun Zeos5.3 komponenten austausche durch Zeos6.6-komponenten oder UniDac-Komponenten, die Arbeit ist die gleiche !!!

Und zu aller Letzt noch ein Wort : Danke für all eure bisherigen Antworten und Tips

Geändert von bdg ( 9. Nov 2012 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 09:31 Uhr.
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