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