![]() |
Datenbank: Interbase • Version: 7.1 • Zugriff über: IB-Express, ADO
Umstellung IB-Express auf ADO (dbGo)
Hallo zusammen.
Ich bin diesem Forum neu, also erstmal einen heißen (30°C) "Guten Morgen Gruß" aus dem schönen "Rheinhessischen Hügelland" :hi:. Meine Arbeitsumgebung: - Windows XP Prof. SP2 - Borland Developer Studio (Delphi) (Update 2) - Interbase 7.1 Und nun zu meinem Problem. Ich greife auf Tabellen mit SQL-Befehlen zu, indem ich eine Datenbankverbindung mit TIBDatabase herstelle, damit eine Instanz von TIBDataSet verbinde und mit dem TIBDataSet eine Transaktion TIBTransaction verbinde. Dann werden die SLQ-Anweisungen für SELECT, UPDATE und INSERT gesetzt, wie z.B.:
Code:
Dann kann ich die Datenmenge öffnen, Daten ändern und speichern.
IbDataSet.SelectSQL.Text := 'SELECT * FROM ksc_user';
IbDataSet.RefreshSQL.Text := 'SELECT * FROM ksc_user WHERE id_user=:id_user'; IbDataSet.InsertSQL.Text := 'INSERT INTO ksc_user (id_user, username, pwd, fullname, rights) VALUES(:id_user, :username, :pwd, :fullname, :rights)'; IbDataSet.ModifySQL.Text := 'UPDATE ksc_user SET username=:username, pwd=:pwd, fullname=:fullname, rights=:rights WHERE id_user=:old_id_user'; IbDataSet.DeleteSQL.Text := 'DELETE FROM ksc_user WHERE id_user=:old_id_user';
Code:
Wenn ich an die TIBDataSet noch eine TDataSource hänge und daran ein TDBGrid, dann kann ich in dem Grid
IbDataSet.Open;
IbDataSet.Edit; IbDataSet.FieldValues['username'] := 'Hans'; IbDataSet.Post; IbDataSet.CommitRetaining; alle Änderungen ausführen wie Einfügen, Ändern und Löschen von Einträgen. Nun möchte ich das Ganze auf die ADO Komponenten (dbGo) umstellen. Hier kann ich nun die SELECT Abfrage einfügen (CommandText), aber sonst nichts. Wie kann ich nun Änderungen speichern ? Irgendwo muss ich ja auch die DELETE und INSERT Anweisungen angeben können. Ich hab da keine Idee wie das Gehen kann. Über Umwege (mit separaten TADOCommand) kriege ich das schon hin, aber nicht so elegant wie mit den IB-Express Komponenten. Kennt jemand von euch eine Lösung ? Vielen Dank und viele Grüße Matthias |
Re: Umstellung IB-Express auf ADO (dbGo)
Und wieso willst Du auf ADO umstellen? Für Interbase sind noch native Komponenten besser als über ADO und evtl. noch ODBC zu gehen.
|
Re: Umstellung IB-Express auf ADO (dbGo)
TADODataset.CommandText nimmt weit mehr auf als nur SELECT-Befehle, und außerdem gibt es ja auch noch zB TADOQuery mit der gewohnten SQL-property und den Befehlen Open (wenn eine Datenmenge erwartet wird) bzw ExecSQL (wenn keine erwartet wird, wie zB bei Datenmanipulationsbefehlen wie INSERT, UPDATE etc), eine Unterscheidung in verschiedene SQL-properties gibt es allerdings nicht. Es gibt TADOStoredProc für Stored Procedures, Transaktionen verwaltet die TADOConnection selbst. Kurzer Rede noch kürzerer Sinn: du kannst alles machen, was du bislang auch machen konntest... der Vorteil ist die Möglichkeit der leichteren Migration auf andere DBMS, wofür man allerdings auf server-spezifische Features verzichten sollte. Und da liegen eben auch gleich wieder die Nachteile...
peinhard |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
|
Re: Umstellung IB-Express auf ADO (dbGo)
Vielen Dank für eure schnellen Antworten.
Hallo Bernhard. Weil ich dann über die "OLE DB Provider" auf Datenbanken wie MS-SQL-Server und Oracel zugreifen kann. Über den "OLE DB ODBC" Provider komme ich dann auch wieder auf Interbase. Hallo Peinhard. Wie man mit den ADO Komponenten auch INSERT und UPDATE Befehle absetzen kann weiss ich. Wenn du dir aber die Beispiele von mir ansiehst wirst du sehen, dass man mit einem TIBDataset alles gleichzeitig machen kann. Deshalb kann man in einem angekoppelten DBGrid auch alle Aktionen ausführen. Genau darum gehts, wie kann ich ein DBGrid an die ADO Komponenten koppeln und im Grid Einfügen, Ändern und Löschen. Viele Grüße Matthias |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
Diese spezielle Konstruktion der IB-Komponenten war mir allerdings wirklich nicht bekannt - und ich find' sie schon charmant... peinhard |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
Unsere Oracle-Eigenheiten-Implementierung ist auf ca. 1600 Quellcodezeilen komprimiert bei einer Exe mit 1. Mio-Quellcodezeilen. Und nochwas: Ich hoffe du willst bei Oracle nicht den MS ADO-Provider nehmen? Dann kannst Du dir gleich in den Kopf schießen da dies eine Machbarkeitsstudie von MS ist das man mit ADO auch mit Oracle arbeiten kannst. Du wirst auf jedenfall einen Provider von Oracle installieren müssen. |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
Für den 'Rest' reicht - toitoitoi - bislang bedingte Compilierung mit verschiedenen Statements in einer Konstanten-Datei. Leider ist SQL eben längst nicht (mehr) 'Der Standard' - Mr Date sendet grimmige Grüße. Wäre vielleicht nicht schlecht, wenn es wirklich ein Gremium gäbe, daß die 'Macht' hätte, DBMS zu 'zertifizieren' und Lizenzen für SQL zu vergeben - oder eben auch nicht. peinhard |
Re: Umstellung IB-Express auf ADO (dbGo)
Hallo Peinhard.
Sorry, aber das funktioniert nicht. Woher soll die Komponente/Treiber wissen wie er die UPDATE, INSERT oder DELETE Anweisungen generieren soll, wenn er nur die SELECT Anweisung kennt. Bei folgender Tabellenstruktur kann ich mir das noch vorstellen, da es einen Primärschlüssel gibt.
SQL-Code:
CREATE TABLE "KSC_USER"
( "ID_USER" INTEGER NOT NULL, "USERNAME" VARCHAR(32) NOT NULL, "PWD" VARCHAR(32) NOT NULL, "FULLNAME" VARCHAR(64) NOT NULL, "RIGHTS" INTEGER DEFAULT 0, PRIMARY KEY ("ID_USER") );
SQL-Code:
Allerdings gibt es keine Information, wie bei einem INSERT der Primärschlüssel
SELECT * from KSC_USER
ID_USER erzeugt werden soll. Ich versuche im Moment auf diese Tabelle zuzugreifen. Über ADO und ODBC auf Interbase und bekomme dabei einen Fehler beim Schreiben der Änderungen mit UpdateBatch(). Das ist das Problem, dass ich im Moment lösen muss. Um das Problem mit den herstellerspezifischen Unterschieden muss ich mich später kümmern. Im Augenblick lautet meine Aufgabenstellung: "Umstieg von Interbase auf MS-SQL-Server 2005". Da ich meine Vorturner aber kenne, wird es irgendwann heissen: "..wir hatten doch schon mal mit Interbase.." oder "..wir haben da einen, der hat schon ein Oracle Cluster..". Also versuche ich über die ADO Komponenten die entsprechenden Weichen zu stellen. Gruß Matthias |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
Zitat:
Zitat:
Zitat:
peinhard |
Re: Umstellung IB-Express auf ADO (dbGo)
Zitat:
Wenn Du die Aufgabe "Umstieg von Interbase auf MS-SQL-Server 2005" hast mach das lieber in folgenden Schritten: 1, Überleg dir eine DB-Neutrale Zugriffsschicht (Bridge Pattern oder ähnliches). Ich würde dir sogar empfehlen keine DB-Sensitiven Controls mehr zu verwenden. 2, Stelle deine Interbase-Zugriffe auf diese Zugriffsschicht 3, Implementier als alternative den Zugriff auf den MS-SQL-Server 2005 Du hast damit folgende Vorteile: 1, Bessere Trennung von Anwendungslogik <-> Datenspeicherung (DB) 2, Keine Abhänigkeit von einem DB-Hersteller (Anti-Pattern: Ventor Lock In). 3, Bessere Erweiterbarkeit (Was machst Du wenn in 1 Jahr ein großer Kunde kommt und unbedingt DB2 will ohne einen ODBC/ADO-Treiber zu installieren haben will?) Nachteil: Mehr Aufwand. |
Re: Umstellung IB-Express auf ADO (dbGo)
Das ist alles absolut nicht von der Hand zu weisen, auch der Verzicht auf DB-Komponenten nicht. Es hängt doch aber auch daran
- wie umfangreich das Projekt ist - wie der geplante weitere 'Lebenszyklus' aussieht - und last not least wieviel Zeit man dafür hat bzw bekommt Daß zuwenig Zeit jetzt dann später noch viel mehr Zeit kosten kann, ist natürlich ebenfalls richtig - nützt aber auch nichts, wenn man in der Zwischenzeit evt 'vom Markt' verschwunden ist oder sich mit seinen Argumenten etwelchen 'Vorturnern' gegenüber nicht durchsetzen kann. Versuchen sollte man es aber, abhängig davon, wie es mit den beiden ersten Punkten aussieht. |
Re: Umstellung IB-Express auf ADO (dbGo)
Hallo zusammen.
Vielen Dank erstmal für eure Hilfe. Das Problem ist dasgleiche wie immer. Es existieren bereits umfangreiche Strukturen und es darf nur so_und_solange dauern. Zum Glück war ich schon so schlau die IB-Express Komponenten nicht direkt in meine Anwendung (also sprich auf das Form ziehen) zu integrieren, sondern eine API aus den Komponenten zu bauen. Daher geht es jetzt schneller, Koponenten zu benutzen, die von TDataset abgeleitet sind. Da ADO sowohl auf die DBS von MS, Oracle und über ODBC noch auf andere zugreifen kann, habe ich mich halt so entschieden. Datensensitive Komponenten, wie TDBGrid verwende ich so gut wie kaum und den Rest hab ich auch ganz schnell rausgeschmissen. Im Augenblick erzeuge ich unter Interbase den Primärschlüssel mit einer Trigger/Generator Kombination. Mit Generator TIBDataSet.GeneratorField bekomme ich den Wert zurück in das TDataset. Also vielen Dank erstmal und schöne Grüße :hi: Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz