![]() |
Datenbank: MySql • Version: 3 • Zugriff über: Zeos6.6
MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha
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 ??? |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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 |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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 |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
Dann lass doch die JOINs raus und erstelle dir LookupFelder, das sieht dann genauso aus und du kannst trotzdem updaten wie gewohnt.
|
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
Zitat:
Zitat:
Zitat:
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. |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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 : ![]() 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 |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
Mit Delphi 5 auf einen neuen Stand bringen? :gruebel:
|
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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 ??? |
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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.
|
AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
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 :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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 by Thomas Breitkreuz