Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi temporäre Tabelle in MS SQL Server (https://www.delphipraxis.net/24516-temporaere-tabelle-ms-sql-server.html)

bttb930 22. Jun 2004 14:00


temporäre Tabelle in MS SQL Server
 
Hallo,

ich habe folgendes Problem: Ich möchte über Delphi eine temporäre Tabelle in MS SQL Server erzeugen. Das mache ich wie folgt:

Delphi-Quellcode:
  with TADOQuery.Create(WPDataModule) do
  try
    Connection := WPDataModule.Connection;
    SQL.Clear;
    SQL.Add('SELECT * INTO #TempTable FROM MyTable');
    ExecSQL;
  finally
    Free;
  end;
Das blöde ist: Die Tabelle ist hinterher nicht mehr vorhanden. Auch wenn ich die gleiche TADOQuery verwende und nach dem ExecSQL z.B. folgendes schreibe:

Delphi-Quellcode:
    SQL.Clear;
    SQL.Add('DROP TABLE #TempTable');
    ExecSQL;
Auch dann ist die temporäre Tabelle schon weg. Nur wenn ich sowohl den SELECT- als auch den DROP-Befehl in die SQL-Eigenschaft packe und dann erst ExecSQL aufrufe, ist die Tabelle beim zweiten Befehl noch sichtbar.

Für private, temporäre Tabellen (also die, die bei MS SQL Server mit einem # beginnen) gilt, dass NUR die Verbindung, die die Tabelle angelegt hat, auch auf die Tabelle zugreifen kann. Offenbar beendet Delphi die Verbindung also sofort nach dem ExecSQL.

Frage: Gibt es eine Möglichkeit, die Verbindung offen zu halten? Welche Möglichkeit(en) gibt es sonst?

Marcus

bttb930 22. Jun 2004 15:04

Re: temporäre Tabelle in MS SQL Server
 
niemand? das muß doch bei anderen datenbanken ähnlich sein - oder gibt es dort keine privaten, temporären tabellen?

man könnte die tabelle auch direkt in der tempdb anlegen - sie würde dann nicht #TempTable heißen, sondern tempdb.dbo.TampTable. Aber diese Tabelle ist nicht privat, d.h. jeder kann sie sehen und ich muß sie auf jeden fall löschen. Bricht das Programm vor dem löschen ab, dann müßte ich sie entweder per hand löschen, oder vor dem erstellen prüfen ob es diese tabelle gibt und sie dann löschen. Leider gibt die Methode TADOConnection.GetTableNames aber nur die Namen der Tabellen der aktuellen DB zurück - und tempdb.dbo.TempTable liegt in tempdb... Außerdem frage ich mich, ob Tabellen in tempdb überhaupt schneller sind als "richtige" temporäre Tabellen?

Marcel Gascoyne 22. Jun 2004 15:16

Re: temporäre Tabelle in MS SQL Server
 
Ich denke mal es liegt an den ADO Komponenten und das nach dem Ausführen Deiner Query die Connection zur Datenbank geschlossen wird. Und der SQL Server löscht die Temp-Tabellen halt beim Trennen der Verbindung...

Mein Vorschlag: Nimm die Open Source Zeos Komponenten, damit sollte das Problem nicht auftauchen. Als kommerzielle Alternative gibt es z.b. auch SQLDirect, womit ich sehr zufrieden bin.

Gruß,
Marcel

BluesKid 22. Jun 2004 15:16

Re: temporäre Tabelle in MS SQL Server
 
Moin moin

Aus der MS-SQL hilfe:

Zitat:

Temp Table Generation Requires SQL Server version 6.5 SP3 or Later

SQL Server version 6.5 is supported by this release of English Query, but only when you install Service Pack 3 (SP3) or later. If you are not running SQL Server 6.5 with SP3, you may encounter problems with generated temp tables that are required for some queries.
hilft dir das irgendwie weiter ?


schönen Gruß

Sam

btw. das frühe pushen (<24h) gibt warscheinlich mecker ;-)

bttb930 22. Jun 2004 15:42

Re: temporäre Tabelle in MS SQL Server
 
Ich hab soeben das Flag TADOConnection.KeepConnection entdeckt und dachte das wäre die Lösung - das stand aber schon vorher auf TRUE. Dann habe ich das Flag State abgefragt, und das enthält nur stOpen (laut Hilfe bedeutet das "Connection object is inactive, but connected to a database."). Leider hat die TADOConnection aber kein Active-Flag. Wahrscheinlich würde es reichen, die Connection aktiv zu halten - das klappt aber auch nicht mit einem Trick (ich habe versucht eine Abfrage zu öffnen und einfach offen zu halten... nützt nichts - State ist trotzdem stOpen und nicht stExecuted).

Zu BluesKid:
Wie finde ich raus welche Version die DB hat?

BluesKid 22. Jun 2004 15:54

Re: temporäre Tabelle in MS SQL Server
 
Sorry, ich glaub das war totaler Quatsch was ich dir da geposted hab :angle2:

Marcel Gascoyne 23. Jun 2004 09:03

Re: temporäre Tabelle in MS SQL Server
 
Zitat:

Zitat von bttb930
Wie finde ich raus welche Version die DB hat?

Per SQL mit
SQL-Code:
select @@version
Gruß,
Marcel

Jelly 23. Jun 2004 09:59

Re: temporäre Tabelle in MS SQL Server
 
Hallo,
schon mal probiert alles über Transaktionen zu steuern. soweit ich weiss, wird in Delphi standrdmässig vor jedem Aufruf von ExecSQL eine Transaktion gestartet, welche bei beenden der Stored Procedure beendet wird. Du kannst aber auch die Kontrolle selbst übenehmen mit Database.StartTransaction und Database.Commit... Habs aber nicht probiert.

Gruß,
Tom

bttb930 23. Jun 2004 10:35

Re: temporäre Tabelle in MS SQL Server
 
Wen's interessiert: Ich habe die Lösung jetzt gefunden:

- Entweder ich erstelle die Tabelle nicht mit TADOQuery sondern direkt mit der Execute-Methode der Connection
- oder ich erweiter den ConnectionString um 'OLE DB Services=-2;'.

Die Lösung habe ich gefunden unter URL (Beiträge 3-4). Dort wird das ganze auch erklärt.


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