AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Tabelle mittels ZEOS-Komponenten anlegen
Thema durchsuchen
Ansicht
Themen-Optionen

Tabelle mittels ZEOS-Komponenten anlegen

Ein Thema von messinger · begonnen am 3. Dez 2009 · letzter Beitrag vom 4. Dez 2009
Antwort Antwort
messinger

Registriert seit: 17. Sep 2008
13 Beiträge
 
#1

Tabelle mittels ZEOS-Komponenten anlegen

  Alt 3. Dez 2009, 17:32
Datenbank: MS SQL Server • Zugriff über: ZEOS
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#2

Re: Tabelle mittels ZEOS-Komponenten anlegen

  Alt 3. Dez 2009, 17:46
kurz und knapp...ja.

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.



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

Registriert seit: 17. Sep 2008
13 Beiträge
 
#3

Re: Tabelle mittels ZEOS-Komponenten anlegen

  Alt 3. Dez 2009, 18:00
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?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Tabelle mittels ZEOS-Komponenten anlegen

  Alt 3. Dez 2009, 21:14
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Tabelle mittels ZEOS-Komponenten anlegen

  Alt 4. Dez 2009, 02:13
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.
fork me on Github
  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 13:28 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