Entwickler-Ecke

Datenbanken - Wie kann ich eine Tabelle im Interbase anlegen


Grave_digger - Mo 17.02.03 19:30
Titel: Wie kann ich eine Tabelle im Interbase anlegen
meine Frage ist warscheinlich lächerlich aber ich finde keine Lösung

ich habe Jahrelang mit Paradox-datenbanken gearbeitet und muss nun auf Interbase umsteigen leider scheint es mir so das mir das verständnis fehlt. ich habe bereits Bücher(z.B. Interbase Datenbankentwicklung mit Delphi) durch gearbeitet aber irgend wie komme ich nicht weiter deshalb bitte ich um hilfe am liebsten wäre ich mir ein stück Quellcode der sehr gut dokumentiert ist oder eine ausführliche beschreibung in deutsch


yukon-troll - Di 18.02.03 14:29

Hallo,

die Erstellung geht ähnlich wie an der IB-Console.

Hier ein kurzes Beispiel:

du erstellst ein Formular mit folgenden Komponenten

IBDatabase (IBD)
IBTransaction (IBT)
IBSQL (IBSQL)

sowie einen Button.

DatabaseName sollte auf eine vorhandene Interbase-Datenbank zeigen,
IBDatabase und IBTransaction sollten gegenseitig zugewiesen sein
(DefaultTransaction bzw. DefaultDatabase).

Bei einem Klick auf den Button führst du folgenden Code aus


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
uses DBLogDlg;

procedure TForm1.ButtonClick(Sender: TObject);
var
  s : string;
begin
  s := 'CREATE TABLE STEUER '
       + '('
       + '  ST_CODE  INTEGER NOT NULL, '
       + '  ST_PROZENT  DOUBLE PRECISION, '
       + '  ST_AB_CODE  VARCHAR(4) CHARACTER SET ISO8859_1, '
       + ' PRIMARY KEY (ST_CODE) '
       + ');' ;

  //zur Datenbank verbinden
  IBD.Connected := true;
  //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;

  //Änderungen in DB speichern 
  IBT.Commit;
  
  IBD.Connected := false;
end;


mfg


foxy - Di 18.02.03 15:28

dann legst du die DB aber wärend der Laufzeit an .... ich hab es immer so gemacht, das ich alles über die IB console gemacht habe ....

ich habe ein schönes tut dazu .... mom .... ich suche :)

ich habs und zwar hier [http://www.delphi-tutorials.de/index.htm]


Grave_digger - Di 18.02.03 16:11

und was muss ich tun wenn ich erstmal eine Datenbank anlegen muss?

den Quellcode und tut habe ich durch gearbeitet und es funktioniert aber ich möchte gern mein eigene Datenbank benutzen und die muss ich wenn nicht vorhanden zur Laufzeit anlegen kann also nicht mir der IBConsole arbeiten

danke für alle Antworten

MFG
Grave Digger


foxy - Di 18.02.03 16:27

wiso willst du mit IB anfangen???

dein kommentar wenn sie nicht vorhanden ist muss ich eine neue anlegen .... also halte ich bei einer Client/Server Beziehung für sehr riskant ... wenn ein User lustich ist dann haste auf einma 100 dbs auf deinem server liegen ....
Damit meine ich, zur Laufzeit eine DB erstellen, würde ich mir genau mal überlegen was du machen willst ....

meine Meinung bitte korrigiert mich :?


Grave_digger - Mi 19.02.03 09:28

ich will mir die installtion erleichtern ich arbeite bis jetzt mit Paradox im Netzwerk aber dort bin ich inzwischen an die Grenzen gestossen und möchte auf IB umstellen
und damit der nutzer die Datenbank nur einmal anlegen kann benutze ich schon Kennzeichen die ein doppel anlegen verhindern. Aber wie schon gesagt möchte ich mir nur die Installation erleichtern

MFG


hansa - Mi 19.02.03 09:45

Hi,

Du mußt Dir mal überlegen, was ein SQL-Script ist. Damit kannst Du eine Datenbank auch komplett neu erzeugen. Du brauchst auch nicht extra ein Installationsprogramm zu schreiben. Ich würde bzw. liefere bei solchen Dingen eine leere DB mit meinem Programm aus, die ich mit dem Script erzeuge.

P.S.: "leere DB" bedeutet : ohne Daten, die Struktur wird mit dem Script gemacht.


Grave_digger - Fr 21.02.03 10:46

Es wird leider so gefordert

ich kann mit SQL leider noch nicht sehr viel anfangen deswegen brauch ich hilfe
der vorschlag mit der leeren datenbank ist in betracht zuziehen da das eine einfache lösung wär

mfg


LCS - Fr 21.02.03 12:40

Hi
in aller Regel erzeuge ich die Datenbank während der Entwicklung mit der IBConsole und die Strukturen innerhalb der DB per SQL-Script. Wenn dann alle Strukturen feststehen, mache ich von dieser DB ein Backup mit der Console und diese .GBK Datei wird mit dem Programm installiert.
Bei Bedarf verwende ich dann einfach den IBRestore-Service um mit diesem Backup aus dem Programm heraus die richtig DB zu erzeugen.
Dadurch brauchst du auf dem Zielrechner nicht mit SQL-Scripts zu hantieren und die Backup-Datei ist gerade mal ein paar KB gross.

Gruss Lothar


hansa - Fr 21.02.03 12:41

Grave_digger hat folgendes geschrieben:
Es wird leider so gefordert...
der vorschlag mit der leeren datenbank ist in betracht zuziehen da das eine einfache lösung wär


Fast hast Du es geschnallt. :mrgreen: Also nochmals :

1. Du machst die leere Datenbank ohne Delphi, am besten mit einem Script, die kopierst Du und fertig, dann hat derjenige, der eine Datenbank fordert seine Datenbank und die Daten muß er dann mit Hilfe Deines Progammes eingeben

2. Mit viel Mühe schreibst Du Dir dafür ein eigenes Programm, was dasselbe macht und somit das Rad zum zweiten mal erfindet. Dann noch viel TamTam : schreibe hin "soll die Datenbank wirklich erzeugt werden". Wird das getan erklärst Du was jetzt pasiert. Dann läßt Du noch ein Video ablaufen. Mit den einzelnen Tables dasselbe. Dann sagt der Kunde "Aha" und ist beeindruckt von Deinem Treiben, wenn er denn überhaupt zuschaut. Er weiß ja sowieso, daß er nichts versteht. Schließlich will er nur seine Datenbank. Wegen vor Ort eventuell auftretender Fehler in Deinem Programm mußt Du dann wieder abziehen und die fragen sich wenn Du weg bist : "Hä, was hat der Spinner vorhin da gemacht ?" Um dies zu vermeiden mußt Du also trotzdem noch eine leere Datenbank mitnehmen.

So krass kann der Unterschied aussehen. :nixweiss:


hansa - Fr 21.02.03 12:46

Ah, LCS wieder aufgetaucht ? :P
LCS hat folgendes geschrieben:
...
Dadurch brauchst du auf dem Zielrechner nicht mit SQL-Scripts zu hantieren und die Backup-Datei ist gerade mal ein paar KB gross.


1. Warum soll er auf dem Zielrechner mit Scripten hantieren :?: So habe ich das nicht gemeint.

2. Warum sollte die GBK und nicht gleich die GDB kopiert werden :?:


LCS - Fr 21.02.03 13:00

Hi
Hansa hat folgendes geschrieben:

Ah, LCS wieder aufgetaucht ?

Ja, bin wieder aus den Versenkungen des netzwerklosen Daseins emporgestiegen. :mrgreen:

Die GBK ist einfach kleiner und vor allem Versionsunabhängig. Wenn du den Restore-Service verwendest, ist es egal welche IB-Version der Kunden nun gerade laufen hat.

Gruss Lothar


foxy - Fr 21.02.03 13:00

noch was ... du hast gesagt willst deine inst. leichter machen ....
du weist, das du auf jeden fall den Client in deiner Inst. auch mitinst. must oder??

also den client für die IB!


hansa - Fr 21.02.03 13:35

LCS hat folgendes geschrieben:
Hi
Ja, bin wieder aus den Versenkungen des netzwerklosen Daseins emporgestiegen.

huch, dabei dachte ich Du seiest in den Unendlichkeiten des Netzwerks verschollen. 8)

Zitat:
...vor allem Versionsunabhängig

Das ist das wichtige :!: Ist sie leer, spielt die Größe an sich wohl keine Rolle. Naja, da habe ich wahrscheinlich nur bis zum nächsten Kirchturm geschaut. Bei mir wird es wahrscheinlich darauf hinauslaufen, daß immer das IB drauf ist, was ich will. :mrgreen: Aber wer weiß.


Grave_digger - Fr 21.02.03 15:27

Das ich IB installieren muss ist klar aber ich will sowas wie ein installtion programm nicht schreiben sondern eigentlich nur kopieren und schnell eine INI-anpassen über eine Schnittstelle und dann wieder weg
das mit der leeren datenbank ist angenommen jetzt habe ich nur noch das problem mit der anmeldung an die datenbank wärend der Laufzeit :?:

ist es den so schwer eine Datenbank während der Laufzeit anzulegen :?:

mfg


Grave_digger - Mo 24.02.03 11:15

kann mir den keiner helfen
ich weiß ich nerve aber warum ist es so schwer ein datenbank während der laufzeit anzulegen :?:


UGrohne - Mo 24.02.03 11:23

Das ist eigentlich gar net schwer:

Du nimmst die IBDatabase-Kompo, trägst alles ein (DBPfad, Server, user, passwort, parameter) und machst CreateDatabase, das wars.

Danach kannste dann ein Skript ausführen lassen, am besten mit einer IBSQL-komponente, das dann die Tabellen, Prozeduren, Trigger usw erstellt. Du musst das dann nur noch Befehlsweise übertragen ein komplettes Skript kannste mit IBSQL nicht ausführen. Das wars schon, hab das bei mir auch schon gemacht..

Gruß


Grave_digger - Mo 24.02.03 13:50

kann ich noch ein stück Quelltext kriegen das wäre net


UGrohne - Mo 24.02.03 15:12

OK, dann werf ich das Fleisch mal den Wölfen vor *g*. Das kommt aus einem meiner Projekte, da hab ich ein SQL-Script als RCDATA-Resource in der EXE

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
//Soll eine neue Datenbank erstellt werden?
IBDatabase.DatabaseName:=EDserver.Text+':'+EDpath.Text;
IBDatabase.Params.Clear;
IBDatabase.Params.Add('USER "'+userED.Text+'"');
IBDatabase.Params.Add('PASSWORD "'+pwED.Text+'"');
IBDatabase.Params.Add('PAGE_SIZE 4096');
IBDatabase.SQLDialect:=3;
 try
  IBDatabase.CreateDatabase;
  //Wenn Neu, dann SQL-Script ausführen
  IBDatabase.Connected:=True;
  IBTransaction2.Active:=True;
  SQLScript:=TResourceStream.Create(hInstance,'SQLScript',RT_RCDATA);
  Script:=TStringList.Create;
  Script.LoadFromStream(SQLScript);
  for i:=0 to Script.Count-1 do begin
       if (Script.Strings[i]='') then Continue;
       if (Script.Strings[i][1]<>' ') AND (Script.Strings[i][1]<>'/') then begin
           IBSQL1.SQL.Text:=Script.Strings[i];
           IBSQL1..ExecQuery;
           end;
       end;
  finally IBDatabase.Connected:=False;end;


Dabei wird die Resource SQLScript geladen und zeilenweise (außer Kommentaren und leeren Zeilen) in IBSQL ausgeführt. Wichtig ist, dass in der Resource wirklich ALLE Befehle in einer einzigen Zeile stehen

Hoffe, Du konntest damit was anfange, habs net besonders überarbeitet

Gruß


Grave_digger - Di 25.02.03 14:28

ich bin satt danke jetzt kann ich mich mal wieder schlafen legen danke schön
mfg