edu-senex/edu/content/flashcards/deck-sql.md

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) | | | |