Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL -Befehl 'CreateTables' at runtime (https://www.delphipraxis.net/213765-sql-befehl-createtables-runtime.html)

wendelin 22. Sep 2023 22:24

Datenbank: Interbase • Version: 6.5 • Zugriff über: IB-Componenten

SQL -Befehl 'CreateTables' at runtime
 
Hallo,
zunächst möchte ich Herrn Jaenicke für seine Antwort auf meine Frage zum Thema 'Create Tables' vom 11.09.23 danken.
Ich habe mein Problem vollständig gelöst, wenn auch mit Schwierigkeiten.
Nun habe ich aber ein neues Problem. Siehe Pfeil auf die Zeile s := 'CREATE TABLE Extend '
Ich möchte den TableName (hier z.B. Extend ) nicht statisch innerhalb des kompletten Strings schreiben ,sondern als z.B.als Übergabe von Edit.Text.
Dies geht aber nicht, denn wenn ich die procedure aufrufe wird mir zwar RunTime eine neue Tabelle erzeugt,allerdings dann mit dem Namen Extend.
Geht das überhaupt mit SQL und wenn ja wie ?



Delphi-Quellcode:
(*        Create Tables on RunTime          *)
(*       TEIL3 --- TEIL3 --- TEIL3           *)
(* ----------------------------------------- *)
procedure TForm3.BitBtn2Click(Sender: TObject);
(* ----------------------------------------- *)
VAR s , Extend : STRING;
begin
   Extend := Edit1.Text;
-->  s := 'CREATE TABLE Extend '
       + '('
       + ' ID1 INTEGER NOT NULL PRIMARY KEY, '
       + ' Stock CHAR(35), '
       + ' AktDatum DATE, '
       + ' StockOPEN NUMERIC(15,2), '
       + ' StockHigh NUMERIC(15,2), '
       + ' StockLOW NUMERIC(15,2), '
       + ' StockCLOSE NUMERIC(15,2) '
       + ');';

  with Datamodule2 do
  begin
    If IBD.Connected = True Then IBD.Close;
    IBD.Params.Clear;
    IBD.Params.Values['user_name'] := 'SYSDBA';
    IBD.Params.Values['password'] := 'masterkey';
    IBD.DatabaseName := g_DBPfad;
    IBD.Open;
    //neue Transaktion starten
    if not IBT.InTransaction then IBT.StartTransaction;
    //SQL-String setzen
    IBSQL.SQL.Clear;
    IBSQL.SQL.Add(s);
    //SQL Anweisung ausführen
    IBSQL.ExecQuery;
    IBT.Commit;
    IBD.Connected := false;
  end;
end;

Danke , Wolfgang

blawen 22. Sep 2023 22:34

AW: SQL -Befehl 'CreateTables' at runtime
 
Zitat:

Zitat von wendelin (Beitrag 1527229)
VAR s , Extend : STRING;
begin
Extend := Edit1.Text;
--> s := 'CREATE TABLE Extend '

Den Variablenname würde ich als erstes umbenennen, z.B. in sTabellenname.
Das ganze könnte z.B. so aussehen.
Delphi-Quellcode:
var s, sTabellenname : String;

begin
  sTabellenname := Edit1.Text;
  s := 'CREATE TABLE ' + sTabellname
     + '('
     +....
Sofern der Inhalt von Edit1 nicht überprüft wird, kann auf die Variable sTabellename verzichtet werden.
Sprechende Namen sind immer hilfreich:
Edit1.Text -> edTabellenname

Dies könnte dann z.B. so aussehen:
Delphi-Quellcode:
var
  sSQL : String;

begin
  sQL := 'CREATE TABLE ' + edTabellenname.Text
       + '('
       +....
Gruss

haentschman 23. Sep 2023 08:10

AW: SQL -Befehl 'CreateTables' at runtime
 
Zitat:

Sprechende Namen sind immer hilfreich
+1 :thumb:...dann braucht man auch keine ungarische Notation...die imho heutzutage verpönt ist. :zwinker: PS: Die Präfixe der Komponenten (edtXXX) zählen nicht dazu...:zwinker:
https://de.wikipedia.org/wiki/Ungarische_Notation

Delphi-Quellcode:
with Datamodule2 do
begin
:kotz:
Warum wird das immer noch benutzt, obwohl alle davor warnen! :warn:

wendelin 23. Sep 2023 10:32

AW: SQL -Befehl 'CreateTables' at runtime
 
Hallo Roland,

vielen Dank für Deine Anrwort.
Es hat auf Anhieb geklappt. Super ! Ich denke, ich muß noch Einiges lernen.. aber ich bin ja erst 78!
Ich habe jetzt noch 2 Fragen.
1. kann ich mit dem selben Schema SQL -> 'DROP TABLE' programmieren ?
2. Bei einem Einplatzsystem (Interbase) : gibt es prnzipiell einen Unterschied zwischen 'DROP DATABASE' und dem einfachen Löschen
des Datenbank-Files ?

Gruß
Wolfgang

blawen 25. Sep 2023 12:04

AW: SQL -Befehl 'CreateTables' at runtime
 
Zitat:

Zitat von wendelin (Beitrag 1527234)
Hallo Roland,

vielen Dank für Deine Anrwort.
Es hat auf Anhieb geklappt. Super ! Ich denke, ich muß noch Einiges lernen.. aber ich bin ja erst 78!
Ich habe jetzt noch 2 Fragen.
1. kann ich mit dem selben Schema SQL -> 'DROP TABLE' programmieren ?
2. Bei einem Einplatzsystem (Interbase) : gibt es prnzipiell einen Unterschied zwischen 'DROP DATABASE' und dem einfachen Löschen
des Datenbank-Files ?

Gruß
Wolfgang

Hallo Wolfgang

1) Ja, dies geht. Beim Text in den Hochkommatas handelt es sich um einen String und mit dem
Zitat:

+ edTabellenname.Text
kann man den variablen Text anhängen. Zu beachten ist, dass vor dem letzten Hochkomma noch ein Leerzeichen steht.

2) Interbase kenne ich nicht speziell, aber es dürfte bei allen Systemen ähnlich sein.
Theoretisch ist es das gleiche, aber das manuelle Löschen der Files ist eine schlechte Option.
Zum einen kann es sein, dass die Datenbank die Files noch sperrt und zum anderen werden interne Einträge (z.B. in der Registry) nicht sauber entfernt.

Darum immer Drop Database verwenden.

Gruss
Roland

wendelin 25. Sep 2023 16:48

AW: SQL -Befehl 'CreateTables' at runtime
 
Hallo Roland,

vielen Dank für Deine kenntnissreichen Antworten.
Mit dem Befehl 'DROP TABLE' klappt es auch.
Wenn ich mal zu Datenbanken (Interbase) noch Fragen habe, werde ich mich
vertrauensvoll an Dich wenden !?
Ich hoffe, es ist Dir recht.

Gruß
Wolfgang


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