136 Zeilen
4,5 KiB
Markdown
136 Zeilen
4,5 KiB
Markdown
# Flashcard Deck: SQL & Datenbankzugriff in Omnis
|
|
|
|
**Thema**: SQL-Zugriff ueber DAMs (Database Access Modules)
|
|
**Karten**: 15
|
|
|
|
---
|
|
|
|
## Karte 1 | Basis
|
|
**Q:** Wie verbindet sich Omnis mit einer Datenbank?
|
|
**A:** Ueber Session-Objekte und DAMs (Database Access Modules). Erst Session erstellen, dann `$logon()`:
|
|
```omnis
|
|
Do lSess.$logon('host', 'user', 'pass', 'sessName') Returns #F
|
|
```
|
|
|
|
---
|
|
|
|
## Karte 2 | Basis
|
|
**Q:** Was ist der Unterschied zwischen `$prepare/$execute` und `$execdirect`?
|
|
**A:** `$prepare`+`$execute` = vorbereitete Abfrage (parameterisiert, wiederverwendbar, sicher). `$execdirect` = direkte Ausfuehrung (einmalig). Fuer SELECT immer `$prepare/$execute` bevorzugen!
|
|
|
|
---
|
|
|
|
## Karte 3 | Basis
|
|
**Q:** Wie holst du Daten aus einer SQL-Abfrage in eine Omnis-Liste?
|
|
**A:**
|
|
```omnis
|
|
Do lStmt.$prepare('SELECT * FROM contact WHERE valid = :1') Returns #F
|
|
Do lStmt.$execute(kTrue) Returns #F
|
|
Do lStmt.$fetch(lResultList, kFetchAll) Returns #F
|
|
```
|
|
|
|
---
|
|
|
|
## Karte 4 | Basis
|
|
**Q:** Was bedeutet `:1`, `:2` etc. in SQL-Statements?
|
|
**A:** Bind-Variablen (Parameter). `:1` = erster Parameter, `:2` = zweiter etc. Werden bei `$execute` der Reihe nach uebergeben. **SICHER** gegen SQL-Injection!
|
|
|
|
---
|
|
|
|
## Karte 5 | Mittel
|
|
**Q:** Was ist der Unterschied zwischen `@[lVar]` und `[lVar]` in Omnis-SQL?
|
|
**A:** `@[lVar]` = Bind-Variable (sicher, parametrisiert). `[lVar]` = direkte Text-Substitution (UNSICHER, SQL-Injection moeglich!). **Immer `@[lVar]` verwenden!**
|
|
|
|
---
|
|
|
|
## Karte 6 | Mittel
|
|
**Q:** Was macht `kFetchAll` vs `kFetchOne`?
|
|
**A:** `kFetchAll` holt ALLE Ergebniszeilen in eine Liste. `kFetchOne` holt nur EINE Zeile (in eine Row oder die naechste Zeile einer Liste). Fuer grosse Ergebnismengen: `kFetchOne` in Schleife fuer bessere Speicher-Kontrolle.
|
|
|
|
---
|
|
|
|
## Karte 7 | Mittel
|
|
**Q:** Wie fuehrst du ein INSERT aus?
|
|
**A:**
|
|
```omnis
|
|
Do lStmt.$execdirect(con('INSERT INTO mytable (name, created) VALUES (@[lName], @[#D])')) Returns #F
|
|
```
|
|
`#D` = aktuelles Datum. Oder mit prepare: `$prepare('INSERT INTO mytable (name) VALUES (:1)')` -> `$execute(lName)`
|
|
|
|
---
|
|
|
|
## Karte 8 | Mittel
|
|
**Q:** Wie machst du ein UPDATE?
|
|
**A:**
|
|
```omnis
|
|
Do lStmt.$prepare('UPDATE orders SET status = :1, modtime = :2 WHERE orderid = :3') Returns #F
|
|
Do lStmt.$execute('completed', #T, lOrderID) Returns #F
|
|
```
|
|
`#T` = aktueller Timestamp.
|
|
|
|
---
|
|
|
|
## Karte 9 | Mittel
|
|
**Q:** Wie pruefst du ob eine SQL-Operation erfolgreich war?
|
|
**A:** Jede SQL-Methode setzt `#F` (den Flag). `Returns #F` faengt den Wert auf:
|
|
```omnis
|
|
Do lStmt.$execute(lID) Returns #F
|
|
If flag true
|
|
# Erfolg
|
|
Else
|
|
# Fehler - lSess.$lasterror fuer Details
|
|
End If
|
|
```
|
|
|
|
---
|
|
|
|
## Karte 10 | Fortgeschritten
|
|
**Q:** Was ist `$lasterror` und `$lasterrortext`?
|
|
**A:** Session-Properties die den letzten SQL-Fehler enthalten. `lSess.$lasterror` = Fehlercode, `lSess.$lasterrortext` = Fehlerbeschreibung. Immer bei `#F = false` pruefen!
|
|
|
|
---
|
|
|
|
## Karte 11 | Fortgeschritten
|
|
**Q:** Wie machst du eine Transaktion in Omnis?
|
|
**A:**
|
|
```omnis
|
|
Do lSess.$begin() Returns #F ;; BEGIN TRANSACTION
|
|
# ... SQL Operationen ...
|
|
If lAllesOK
|
|
Do lSess.$commit() Returns #F ;; COMMIT
|
|
Else
|
|
Do lSess.$rollback() Returns #F ;; ROLLBACK
|
|
End If
|
|
```
|
|
|
|
---
|
|
|
|
## Karte 12 | Fortgeschritten
|
|
**Q:** Was ist ein "DAM" in Omnis?
|
|
**A:** Database Access Module - ein Treiber fuer verschiedene DB-Systeme. Wichtige DAMs: `PGSQLDAM` (PostgreSQL), `OABORDAM` (Oracle), `MYSQLDAM` (MySQL), `ODBCDAM` (ODBC). Solution2 nutzt `PGSQLDAM`.
|
|
|
|
---
|
|
|
|
## Karte 13 | Fortgeschritten
|
|
**Q:** Wie definierst du die Spalten einer Liste aus einem SQL-Ergebnis automatisch?
|
|
**A:** Entweder `$getAllCols()` nach dem Fetch, oder `$definefromsqlclass('scMySchema')` vor dem Fetch. Automatisch: Omnis erkennt die Spalten beim Fetch von selbst, wenn die Liste leer ist.
|
|
|
|
---
|
|
|
|
## Karte 14 | Fortgeschritten
|
|
**Q:** Was ist der Unterschied zwischen Server-Side SQL und Client-Side SQL in Remote Forms?
|
|
**A:** Server-Side: SQL laeuft auf dem Omnis-Server (normal). Client-Side: Geht NICHT - der JS-Client im Browser hat keinen DB-Zugriff. Alle Daten muessen ueber Server-Methoden geladen werden.
|
|
|
|
---
|
|
|
|
## Karte 15 | Fortgeschritten
|
|
**Q:** Wie wird in Solution2 die DB-Verbindung verwaltet?
|
|
**A:** Ueber die `DBAccess`-Library. Sie verwaltet Sessions, Berechtigungen und Connection-Pooling. Die Session wird beim Login erstellt (`oLogin`/`oLogon`) und ueber `ioDBAccessStartup` im Navigator initialisiert.
|
|
|
|
---
|
|
|
|
## Spaced Repetition Tracking
|
|
|
|
| Karte | Zuletzt | Naechste | Schwierigkeit |
|
|
|-------|---------|----------|---------------|
|
|
| (wird beim Ueben gefuellt) | | | |
|