Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Tabelle mittels ZEOS-Komponenten anlegen (https://www.delphipraxis.net/144262-tabelle-mittels-zeos-komponenten-anlegen.html)

messinger 3. Dez 2009 16:32

Datenbank: MS SQL Server • Zugriff über: ZEOS

Tabelle mittels ZEOS-Komponenten anlegen
 
Hallo Leute,

irgendwie stehe ich gerade auf dem Schlauch. Ich bin gerade dabei eine Datenbankanwendung zu entwerfen. Bisher soll der MS SQL Server angesprochen werden, der Auftraggeber möchte aber ausdrücklich später auch andere DB verwenden können - insbesondere MySQL oder Firebird und evt. auch Access. Um das nicht komplett selber zu machen (Stichwort Bridge-Pattern), habe ich mich für die Verwendung von ZEOS entschieden. Klappt soweit auch wunderbar. Jetzt würde ich gern eine neue Tabelle anlegen - nur wie mache ich das. Klar - ich kann das direkt per SQL-Statement machen. Aber habe ich dann nicht wieder das Problem mit den unterschiedlichen DB und evt. Unterschieden im Syntax? Kann man direkt über eine der ZEOS-Komponenten eine neue Tabelle anlegen? Oder brauche ich da noch was anderes zusätzlich - ich bin da noch über ADOX gestolpert (hatte aber gehofft, dass durch Nutzung der ZEOSLib umgehen zu können).

Vielen Dank schon mal.

haentschman 3. Dez 2009 16:46

Re: Tabelle mittels ZEOS-Komponenten anlegen
 
kurz und knapp...ja. :zwinker:

du übergibst den "Erstellstring" der Connection als Property.
Bei Firebird sieht das so aus:
Delphi-Quellcode:
ZConnection1.User:= 'SYSDBA';
ZConnection1.Password:= 'masterkey';
ZConnection1.Database:= DBOrdner + DBDatei;
ZConnection1.HostName:= DBHost;
ZConnection1.Properties.Add ('CreateNewDatabase=CREATE DATABASE ' +
                        QuotedStr(Datenbank) + ' USER ' + QuotedStr('SYSDBA') + ' PASSWORD ' + QuotedStr('masterkey') + ' PAGE_SIZE 4096');
ZConnection1.Connect;
Datenbank:= lokaler Ordner zur DB aus Serversicht


wenn die DB erstellt ist die Property wieder löschen.

:hi:

edit:
Zitat:

Jetzt würde ich gern eine neue Tabelle anlegen
- meinst du wirklich Tabelle ? oder Datenbank.
- Tabellen kannst du doch per SQL anlegen :gruebel: "CREATE TABLE...."
- um die syntaktischen Unterschiede kommst du nicht herum. Da mußt du notfalls für verschiedene Systeme mehrere Anweisungen anlegen

messinger 3. Dez 2009 17:00

Re: Tabelle mittels ZEOS-Komponenten anlegen
 
Mhm, ich meine tatsächlich Tabellen, die ich gern anlegen würde. Hatte halt gehofft, bei ZEOS gibt es da auch was unabhängiges was mir den Zugriff auch verschiedene DB's abnimmt.

Wie sieht's denn bei Verwendung von ADOX aus? Da kann ich ja scheinbar neue Tabellen anlegen, nutze aber doch sicher ADO dabei -> müsste also auch für MySQL den ADO-Weg gehen?

hoika 3. Dez 2009 20:14

Re: Tabelle mittels ZEOS-Komponenten anlegen
 
Hallo,

das S in SQL steht halt für Structured, nicht für Standard.

Du musst dich schon um die Unterschiede der DB's kümmern.

Z.B. definiere verschiedene "Create Table" - Aufrufe.

Oder mache besser gleich ein Script (pro DB verschieden),
das ist übersichtlicher.


Heiko

sx2008 4. Dez 2009 01:13

Re: Tabelle mittels ZEOS-Komponenten anlegen
 
Schreib dir eine Klasse, die deine Felder in SQL übersetzt.
Hier das Grundkonzept:
Delphi-Quellcode:
TCreateTableBuilder = class(TObject)
private
   FSQL : TStringList;
public
   procedure AddStringField(const fname:string; len:integer; AllowNull:boolean);virtual;
   procedure AddBooleanField(const fname:string; AllowNull:boolean);virtual;
   ...
   property TableName:string;
   property SQL:TStrings read FSQL;
end;
Vor dieser Klasse gibt es dann jeweils eine Ableitung für die verschiedenen Datenbanken.
Du könntest auch die vorhandenen Klassen TFieldDef und TFieldDefs benützen und daraus die CREATE TABLE Anweisung generieren.

ADOX funktioniert nur für MS SQL Server und MS Access zufriedenstellend.

Und dann gibt es noch ein Grundsatzproblem:
Es gibt z.B. Kunden, die möchten unbedingt Oracle einsetzen; andere möchten IBM DB2 (eine ganz furchtbare Datenbank!).
Gibt man diesen Wünschen nach, dann ist das fast schon die Garantie für's Scheitern.
Hast du genug Manpower, um die Anwendung auf allen diesen Datenbanken zu testen?
Reicht der kleinste gemeinsame Nenner aller Datenbanken aus um darauf ein vernüftiges Programm aufzusetzen?
Hast du genug Hardware um für jeden Datenbankhersteller einen Server bereitzuhalten?
Ist dir klar, dass manche Feldnamen auf Datenbank A erlaubt sind, dagegen auf Datenbank B ein Schlüsselwort darstellen?
Bei mehr als drei Datenbanken, die unterstützt werden sollen wird's dann extrem unproduktiv.

Man muss auch zwischen der eigenen Datenbank für die Anwendung und Fremddatenbanken unterscheiden.
Aus einer fremden Datenbank über ODBC oder ADO ein paar Daten aus einer Tabelle zu importieren ist
relativ einfach.
Solange es einen funktionierenden ODBC/ADO-Treiber gibt.
Für die eigene Datenbank sollte man sich aber auf ganz wenige Hersteller beschränken.


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