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

4,5 KiB

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

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:

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:

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:

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:

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:

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)