Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MyDac und Temporäre Tabellen (https://www.delphipraxis.net/178456-mydac-und-temporaere-tabellen.html)

DelTurbo 9. Jan 2014 08:17

Datenbank: MySql • Version: 5.x • Zugriff über: MyDac

MyDac und Temporäre Tabellen
 
Hi,
ich habe ein problem mit Temporären Tabellen und MyDac. Bei "Geht nicht" bekomme ich die rückmeldung das es keine tmp Tabelle gibt.

Das ist nur ein hingefummeltes beispiel, um zu verdeutlichen was ich meine.

Geht:
Delphi-Quellcode:
Query.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;INSERT INTO Test(T1,T2,Status) VALUES (1,1,False);INSERT INTO tmp(PID) VALUES (LAST_INSERT_ID());');
Query.Execute;
Geht nicht:
Delphi-Quellcode:
Query.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;');
Query.Execute;
// Und dann in einer schleife folgendes.
Query.Sql.Clear;
Query.Sql.Add('INSERT INTO Test(T1,T2,Status) VALUES (1,1,False);INSERT INTO tmp(PID) VALUES (LAST_INSERT_ID());');
Query.Execute;
Mache ich das z.b. mit Navicat for MySQL, dann kann ich an die tmp Tabelle bis ich die Connection wirklich schließe.

Danke im voraus

Memo 9. Jan 2014 08:36

AW: MyDac und Temporäre Tabellen
 
In Deinem Beispie "Geht nicht" heißen die erzeugte Tabelle und die in die Du einfügen willst unterschiedlich.

DeddyH 9. Jan 2014 08:49

AW: MyDac und Temporäre Tabellen
 
Nö, es sind 2 Tabellen in einem Statement, ich hab das auch erst nicht gesehen.

DelTurbo 9. Jan 2014 08:57

AW: MyDac und Temporäre Tabellen
 
Ne, also die Tabelle Test gibt es schon. Es geht im grunde nur um die Tabelle tmp, die "verschwindet". Laut MySql wird die aber erst gedropt wenn man die Connection schließt. Und das stimmt sogar ;)

Jasocul 9. Jan 2014 09:25

AW: MyDac und Temporäre Tabellen
 
Klingt nach einem automatischen Disconnect zwischen den Aktionen.
Schau mal nach, wie dein DisconnectedMode eingestellt ist.

DelTurbo 9. Jan 2014 09:35

AW: MyDac und Temporäre Tabellen
 
Ist False. Ist ja default. An den Default Werten habe ich nix geändert.

Jumpy 9. Jan 2014 09:54

AW: MyDac und Temporäre Tabellen
 
Müsste man nicht in der zweiten Version immer SQL.Text statt SQL.Add nehmen? Das Statement wird ja sonst immer länger...
Oder ein SQl.Clear dazwischen bauen...

DelTurbo 9. Jan 2014 09:59

AW: MyDac und Temporäre Tabellen
 
Jop, ein Clear ist dazwischen. Wie gesagt, oben das ist grade mal so hingefummelt. Aber ich änder das grade. Wäre aber Theoretisch nicht schlimm, wenn man das Execute nach der schleifen machen würde. Aber der Effekt bleibt. Die tmp Tabelle ist weg.

Danke.

rapante 9. Jan 2014 10:19

AW: MyDac und Temporäre Tabellen
 
Ich glaube mich zu erinnern, dass in der Execute-Methode die Verbindung zuerst getrennt wird...

DelTurbo 9. Jan 2014 11:21

AW: MyDac und Temporäre Tabellen
 
Zitat:

Zitat von rapante (Beitrag 1242835)
Ich glaube mich zu erinnern, dass in der Execute-Methode die Verbindung zuerst getrennt wird...

Das wär ja blöd. Was soll man denn statt Execute nehmen?

rapante 10. Jan 2014 10:09

AW: MyDac und Temporäre Tabellen
 
Weil's mich nicht losgelassen hat, hab ich versucht das nachzuvollziehen.
Die Connection wird durch den Aufruf von Excute NICHT getrennt.
Die angelegte temporäre Tabelle existiert auch über mehrere getrennte Execute's,
aber es funktioniert dennoch nicht:
Hier gibts den Fehler "Tabelle existiert nicht"
Delphi-Quellcode:
  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;');
  MyQuery1.Execute;

  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('INSERT INTO tmp(PID) VALUES (2);');
  MyQuery1.Execute;
Hier knallts auch weil die Tabelle "tmp" bereits existiert
Delphi-Quellcode:
  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;');
  MyQuery1.Execute;

  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;');
  MyQuery1.Execute;
Ja wie denn jetzt, entweder sie existiert oder sie existiert nicht?!

DelTurbo 10. Jan 2014 10:17

AW: MyDac und Temporäre Tabellen
 
Ich habe das ganze mal mit DirectMySql versucht. Klappt einwandfrei. Mehr kann ich dazu leider auch nicht sagen. Man findet aber auch nix im netz.

Das ist kein Fehler vom Server, sonst würde es ja mit anderen sachen nicht gehen, sondern vom MyDac.

Danke für deine rückmeldung.

baumina 10. Jan 2014 10:51

AW: MyDac und Temporäre Tabellen
 
Ich habs grad mal mit UniDAC ausprobiert. Auch dort klappt das einwandfrei.

VCLControls 10. Jan 2014 10:55

AW: MyDac und Temporäre Tabellen
 
Den Code von rapante habe ich mit MyDAC probiert und funktioniert einwandfrei.
Delphi-Quellcode:
  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('CREATE TEMPORARY TABLE tmp (ID int NOT NULL AUTO_INCREMENT, PID Int, PRIMARY KEY (ID)) ENGINE=INNODB;');
  MyQuery1.Execute;

  MyQuery1.SQL.Clear;
  MyQuery1.Sql.Add('INSERT INTO tmp(PID) VALUES (2);');
  MyQuery1.Execute;

rapante 10. Jan 2014 11:27

AW: MyDac und Temporäre Tabellen
 
@VCLControls
Welche Version der MyDac Komponenten hast du im Einsatz?

Bei mir läuft 7.6.11

VCLControls 10. Jan 2014 11:48

AW: MyDac und Temporäre Tabellen
 
Zitat:

Zitat von rapante (Beitrag 1243005)
Bei mir läuft 7.6.11

Da bin ich weit hinten: Version 4.40 mit Delphi 7

Was man aber noch versuchen könnte, wenn es an der Version liegt, das Create der Tmp-Tabelle über Execute der TMyConnection zu machen und das Insert über die Query1.
Wenn das Nichts bringt SQL.Clear mal durch SQL.Text ersetzen.
Evt. bringt es ja was.

DelTurbo 10. Jan 2014 11:50

AW: MyDac und Temporäre Tabellen
 
Ich habe 7.1.6.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 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