Andreas Kosch Client/Server Datenbankentwicklung mit Delphi Verlag GmbH Inhalt Inhaltsverzeichnis Vorwort 1 1 Das Buch zum Buch 3 1.1 Warum? 3 1.2 Der Aufbau des Buches 4 1.3 Die System-Konfiguration 7 Abschnitt I - Theorie der Datenbanken 2 Datenbanken 11 2.1 Datenbank - was ist das ? 11 2.2 Anforderungen an eine Datenbank 13 2.3 Relationales Datenbankmanagementsystem 16 2.4 Relationale Datenbank 18 2.4.2 Tabellen 21 2.4.3 Primär- und Fremdschlüssel 25 2.4.4 Relationale Operatoren 30 2.5 Desktop-Datenbank oder Client/Server-Lösung ? 33 2.5.1 Vergleich der beiden Prinzipien 36 2.5.2 Entscheidungsrichtlinien 38 3 Datenbankdesign 3.1 Anwendungsplanung 41 3.1.1 Wasserfallmodell vs. RAD-Zyklus 41 3.2 Logisches und physisches Datenbankdesign 43 3.3 ER-Modell als Hilfsmittel für das logische Design 44 3.4 Konvertieren des ER-Modells in Relationen 48 3.5 Planung der Datenbank 50 41 I Inhalt 3.5.1 Eintabellen-vs. Multitabellen-Datenbanken 51 3.6 Normalisierung einer Datenbank 52 3.6.1 Die Ausgangslage 54 3.6.2 Die 1. Normalform 54 3.6.3 Die 2. Normalform 56 3.6.4 Die 3. Normalform 57 3.6.5 De-Normalisierung 60 3.7 Arbeiten mit normalisierten Tabellen 62 3.7.1 Die Regeln zur relationalen Integrität 62 3.7.2 Referenzintegrität 63 3.7.3 Deklarative Referenzintegrität vs. Trigger 65 3.8 Index 66 3.9 Fat Server vs. Fat Client 69 3.10 Resümee 70 Abschnitt II - Minimalversion für einen Benutzer 4 Filesystem-Datenbanken 73 4.1 Pascal-Records in einer typisierten Datei 73 4.2 Minidatenbank mit TClientDataSet 76 4.2.1 TClientDataSet - eine Kurzeinführung 77 4.2.2 Telefonbuch mit einer Datenmenge 78 4.2.3 Mehrere Datenmengen in einer Datei 81 4.2.4 Nested Datasets 87 Abschnitt III - Borland Database Engine (BDE) 5 BDE und die Datenbanken 91 5.1 Eine Kurzbeschreibung 91 5.2 Alias - ein Synonym für die Datenbank 93 5.3 Datenbankformate - Delphis reiche Auswahl 95 5.4 Das Paradox-Tabellenformat 98 5.4.1 Paradox-Versionen 98 5.4.2 Das technische Prinzip 99 5.4.3 Paradox-Tabellen 103 5.4.4 Paradox-Indizes 108 5.4.5 Paradox-Besonderheiten 111 5.4.6 Mehrbenutzerzugriff auf eine Paradox-Datenbank 114 5.4.7 BDE und Paradox 122 5.5 Zugriff auf Fremdformate 125 5.5.1 ODBC 125 5.6 Delphi 5 und die BDE-Alternative A D O 131 5.6.1 OLE DB 132 5.6.2 Von ODBC über DAO zu A D O 136 5.6.3 Das A D O Programmiermodell 137 6 BDE - ein Blick hinter die Kulissen 6.1 Die Architektur der BDE 139 6.2 Leistungsmerkmale der BDE 140 6.3 IDAPI - Aufbau und Verwendung 141 139 6.4 IDAPI-Objekte 143 6.5 Einsatzbeispiel „DriverExplorer" 146 6.6 Einsatzbeispiel Datensatznummernanzeige 150 6.7 BDE in einer DLL verwenden 154 6.8 SQL-Monitor über BDE-Callback nachbauen 159 6.9 Resümee 166 Abschnitt IV - Desktopdatenbanken 7 Desktop-Datenbankanwendungen 169 7.1 Merkmale einer Desktopdatenbank 169 7.2 Das Delphi-Prinzip 170 7.3 Das Beispielprojekt »FuncSrc« 171 7.3.1 Die Datenbank 172 7.3.2 Die Projektdatei 172 Inhalt 7.3.3 Das Datenmodul 174 7.4 Datenmodul in MDI-Anwendungen 176 7.4.1 TSession + TDatabase 177 7.4.2 Die Instanzierung des Datenmoduls 179 7.5 Wertpapierverwaltung - ein komplexes Beispiel 180 7.5.1 Die Datenbank 181 7.5.2 Das Datenmodul 183 7.5.3 Sound oder nicht Sound - das ist hier die Frage! 188 7.5.4 SQL-Abfrage in einem eigenen Thread 191 7.5.5 Datenbank-Backup 196 7.5.6 Auswertungen - dank SQL sehr einfach 197 7.6 Desktopdatenbanken - ein Nachruf? 200 Abschnitt V - SQL 8 SQL - der Standard 8.1 Was ist SQL ? 8.2 SQL-Kommandoklassen 8.2.1 Data Definition Language - DDL 8.2.2 Data Manipulation Language - DML 8.2.3 Data Query Language - DQL 8.2.4 Transaction Control Language - TCL 8.2.5 Database Administration Language - DAL 8.3 W i e verwaltet SQL Daten ? 8.4 SQL-Befehlsausführung 8.5 Aufbau eines SQL-Befehls 8.6 SQL-Elemente 8.6.1 SQL-Zeichen 8.6.2 SQL-Schlüsselwörter 8.6.3 Bezeichner und Namen 8.6.4 Datentypen 8.6.5 Ausdrücke 8.6.6 Selektionsbedingungen IV 201 201 207 208 208 209 212 213 215 220 221 222 222 222 225 228 230 231 Inhalt 8.6.7 Operatoren 233 8.6.8 Aggregatfunktionen 235 8.6.9 Funktionen 236 8.6.10 Zeilen gruppieren 238 8.6.11 Join - Daten aus mehreren Tabellen abfragen 239 8.6.12 Datenintegrität 245 9 SQL-Beispiele 9.1 Step by Step - ein Exkurs in die SQL-Welt 247 9.2 Besonderheiten von Local SQL 257 9.2.1 Verwendung von BDE-Aliasbezeichnern 257 9.2.2 Lange, Leerzeichen enthaltende Tabellenspaltennamen 258 9.2.3 Datenimport aus anderen Datenbanken 259 9.2.4 Local SQL und die Datumswerte 259 9.3 Parametrisierte SQL-Abfragen 260 9.4 SQL und Sonderzeichen 262 9.5 SQL und der InterBase Server 263 247 Abschnitt VI - Client/Server-Datenbanken 10 Client/Server - Ein erstes Beispiel 265 10.1 Datenbankformular-Experte (TTable) 265 10.2 Datenbankformular-Experte (TQuery) 267 11 Was ist an Client/Server so anders? 11.1 Verarbeitung der Daten aus der Datenbank 269 11.2 Das TQuery.Refresh-Problem 271 1 1.3 Warum ist der InterBase beim Speichern so langsam ? 276 11.3.1 Das Mysterium der DRIVER FLAGS 280 1 1.3.2 Treiber-Eigenschaft COMMIT RETAINING 284 1 1.4 Record/Key deleted 285 1 1.5 TQuery + JOIN = Read-only? 288 11.6 TUpdateSQL 291 269 Inhalt 11.6.1 Das Wirkungsprinzip 292 1 1.6.2 Das Beispielprogramm 294 1 1.7 TUpdateSQL - Alternative OnUpdateRecord 299 11.8 Resümee 302 12 TTable, TQuery oder TStoredProc ? 12.1 Der technische Unterschied 304 12.2 Die Qual der Wahl 306 12.3 Eine Server-Tabelle wird über TTable geöffnet 307 1 2.4 Server-Tabelle über TTable durchsuchen 303 310 12.5 Datensätze über TQuery suchen 312 12.6 Entscheidungskriterien 313 12.6.1 Experimente als Entscheidungshilfen 315 12.6.2 Das zweite Experiment 323 12.7 Beschränkung der Ergebnismenge 326 12.7.1 MAX ROWS - das Sicherheitsventil der BDE 326 12.7.2 TQuery-Nachfolger mit eingebautem Sicherheitsventil 327 12.7.3 Stored Procedure mit eingebautem Sicherheitsventil 329 12.8 Welcher Komponenten-Mix ist der Beste? 330 12.8.1 TEdit oder TDBEdit? 330 12.8.2 TQuery oder DbiQExecDirect ? 331 12.8.3 TDatabase oder InterBase-API? 332 13 Mehrbenutzerzugriff 13.1 Probleme bei der parallelen Verarbeitung 337 13.2 Transaktionen 341 13.2.1 ACID-Eigenschaften einer Transaktion 342 13.2.2 Transaktionszustände 344 13.2.3 Transaktionsmodelle 345 13.2.4 Delphis Transaktionsverwaltung 346 13.3 Sperrverfahren - ein Überblick 347 13.4 Der im SQL-Standard vorgesehene Sperrmechanismus 349 13.5 Das Sperrverfahren des InterBase Servers 350 13.5.1 Versioning - die Multigenerationenarchitektur 351 VI 337 Inhalt 13.5.2 InterBase-Deadlocks 354 13.5.3 Die Transaction Isolation Level des InterBase Servers 357 13.5.4 Der praktische Versuch via InterBase Windows ISQL 359 13.6 TDatabase-Eigenschaft IsolationLevel 361 13.6.1 TDatabase.IsolationLevel vs. InterBase-TIL 362 13.6.2 Praktische Versuche mit TTable 364 13.6.3 Praktische Versuche mit TQuery 369 13.6.4 Praktische Versuche mit einer Delphi-Anwendung 371 13.6.5 Deadlock-Fehlermeldung abfangen 378 13.7 BDE-Eigenschaft PASSTHRUMODE 382 13.8 TDataset-Eigenschaft UpdateMode 385 13.9 Praktische Beispiele 387 13.9.1 InterBase-Tabellen komplett sperren 387 13.9.2 Einzelne Datensätze sperren 390 14 Upsizing - von Paradox zu InterBase 14.1 Vergleich der Tabelleneigenschaften 395 14.2 Datenübernahme 396 14.2.1 Data Pump-Experte 397 14.2.2 Die Datenbankoberfläche 401 14.2.3 Local SQL 402 14.2.4 Daten-Export/Import über eine externe Tabelle 402 14.2.5 Backup und Restore 406 15 InterBase Server 15.1 Der Server-Steckbrief 408 15.2 Die Werkzeugkiste 412 15.2.1 InterBase Configuration und InterBase Guardian 413 15.2.2 Communication Diagnostic Tool 415 15.2.3 InterBase Server Manager 417 15.2.4 InterBase Windows ISQL 426 15.2.5 InterBase License Registration 427 15.2.6 Kommandozeilen-Tools des InterBase Servers 428 15.3 InterBase und die BDE 431 395 407 Inhalt 15.3.1 Character Set vs. LANG DRIVER 431 15.3.2 Zugriff im Netzwerk 437 15.4 InterBase und der IIS 438 15.5 InterBase-Benutzer 439 15.6 Sweeping 443 15.7 InterBase Optimizer 447 16 Die InterBase-Datenbank 16.1 Page Size 449 16.2 InterBase-Datentypen 450 16.2.1 CHAR vs. VARCHAR 451 16.2.2 BLOB-Felder 453 16.2.3 Genauigkeit von numerischen Datentypen 454 16.3 Domains 466 16.4 Generator 473 16.5 Procedure and Trigger Language 476 16.5.1 Anwendungsbegrenzer 477 16.6 Trigger 478 16.7 Stored Procedures 481 16.7.1 Stored Procedure-Typen 482 16.7.2 SELECT.... INTO 483 16.7.3 SUSPEND vs. EXIT vs. END 483 16.7.4 "Stack overflow" vermeiden 484 16.7.5 Beispiele 486 16.8 Exceptions 492 16.9 Event Alerts 494 16.9.1 Event Alerter-Beispiel 494 16.9.2 Das TIBEventAlerter-Prinzip 498 16.9.3 Event Alerter-Probleme 500 16.9.4 TOSIBEventAlerter - eine Alternative zu TIBEventAlerter 501 16.10 User Defined Functions 502 449 16.10.1 IB_UDF.DLL - das offizielle Zubehör 503 16.10.2 OSUDF.DLL - das Beispiel zum Thema 504 InterBase-Datenbank anlegen 512 16.11 Inhalt 16.11.1 Variante a) InterBase Interactive SQL 51 2 16.11.2 Variante b) InterBase Interactive SQL-Script 515 16.11.3 Variante c) InterBase API 515 16.11.4 Variante d) TIBDatabase-Methode CreateDatabase 518 16.12 519 InterBase-Tabellen 16.12.1 Eigene Namen für Primärschlüssel vergeben 520 16.12.2 Kommentare für Tabellen und Spalten 521 16.12.3 Maximale Länge eines Datensatzes berechnen 522 16.12.4 Read Only-Tabellen? 523 16.12.5 VARCHAR-Spaltengröße nachträglich ändern 523 16.12.6 Temporäre Tabelle simulieren 527 16.12.7 RDB$DB_KEY 528 16.12.8 Testdaten generieren 532 16.12.9 Referenzielle Integrität mit dem InterBase 5.x 535 16.12.10Dependencies 539 16.13 541 SQL Privileges 16.13.1 GRANT - Rechte vergeben 542 16.13.2 REVOKE - Rechte entfernen 542 16.13.3 SQL Roles 543 16.14 Wie geht's weiter? 545 17 C/S-Anwendung »SrcArc« 17.1 Wozu? 547 17.2 Die SrcArc-Datenbank »SRCARC.GDB« 548 17.3 Das Projekt SrcArc - eine Übersicht 553 17.4 Splash-Formular 554 17.5 Datenmodul 556 17.5.1 TDatabase 557 17.5.2 OnCreate und OnDestroy 559 17.5.3 Master-Details-Verbindung 560 17.5.4 Persistente TFields 561 17.5.5 Anwender hat ein Projekt ausgewählt 564 17.5.6 Anzeige des Inhalts einer gespeicherten Projektdatei 565 17.5.7 Neue Version anlegen und die Projektdateien importieren 569 547 IX Inhalt 7.6 Das Hauptfenster 574 7.6.1 Projekte über TreeView anzeigen und auswählen 574 7.6.2 Formulare aufrufen 576 77 Formular "Projektdateien importieren" 577 7.8 Der Dateiinhalt-Betrachter 577 18 Multithreading 579 8.1 Prozesse und Threads 580 8.1.1 Threads unter W i n 3 2 582 8.1.2 TThread - Delphis Threadobjekt 583 8.2 Formular-Initialisierung in einem Thread 585 8.3 C/S-Anwendung IBCSDemo 591 8.3.1 Vorbereitungen im Datenmodul 592 8.3.2 Login mit zwei gleichzeitig aktiven Datenbankverbindungen 593 8.3.3 TActionList im Hauptformular 595 8.3.4 Hintergrundsuche im Datenbestand 596 8.3.5 PLZ-Eingabe füllt die Combobox mit den Ortsnamen 603 8.3.6 Datensatz über TStoredProc neu anlegen 605 8.3.7 TClientDataset als temporäre Speicher-Tabelle 606 8.3.8 Kunden im Bestand suchen 612 Abschnitt VII - Three-tier-Datenbanken 19 Three-Tier-Anwendungen 19.1 Warum? 617 19.2 Wie? 622 19.3 Resümee 623 Index x 617 625