AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi temporäre Tabelle in MS SQL Server
Thema durchsuchen
Ansicht
Themen-Optionen

temporäre Tabelle in MS SQL Server

Ein Thema von bttb930 · begonnen am 22. Jun 2004 · letzter Beitrag vom 23. Jun 2004
Antwort Antwort
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#1

temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 14:00
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
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 15:04
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?
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#3

Re: temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 15:16
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
Marcel Gascoyne
  Mit Zitat antworten Zitat
Benutzerbild von BluesKid
BluesKid

Registriert seit: 2. Sep 2003
Ort: NRW
133 Beiträge
 
Delphi 2005 Professional
 
#4

Re: temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 15:16
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
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#5

Re: temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 15:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von BluesKid
BluesKid

Registriert seit: 2. Sep 2003
Ort: NRW
133 Beiträge
 
Delphi 2005 Professional
 
#6

Re: temporäre Tabelle in MS SQL Server

  Alt 22. Jun 2004, 15:54
Sorry, ich glaub das war totaler Quatsch was ich dir da geposted hab
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#7

Re: temporäre Tabelle in MS SQL Server

  Alt 23. Jun 2004, 09:03
Zitat von bttb930:
Wie finde ich raus welche Version die DB hat?
Per SQL mit
select @@version Gruß,
Marcel
Marcel Gascoyne
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#8

Re: temporäre Tabelle in MS SQL Server

  Alt 23. Jun 2004, 09:59
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
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#9

Re: temporäre Tabelle in MS SQL Server

  Alt 23. Jun 2004, 10:35
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.
  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 22:51 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