Kako gonilnik razvršča in javlja odgovore
graph TD
A["Odgovor storitve ali prekinitev povezave"] --> B{"Status HTTP"}
B -->|"2xx"| C{"Ali se oblika ujema z zahtevo?"}
C -->|"da"| D["Rezultat: vrstice, število ali prizadeti zapisi"]
C -->|"ne"| X["08S01: odgovor neuporaben"]
B -->|"401, 403 z izzivom"| H["Vprašaj za kodo ali identiteto, zahtevo enkrat pošlji znova"]
B -->|"4xx s sporočili podatkovne zbirke"| E["za vsako sporočilo en diagnostični zapis s številko in SQLSTATE"]
B -->|"drugi 4xx, 5xx, 504"| F["en diagnostični zapis s statusom HTTP kot številko"]
A -->|"povezava prekinjena"| W["ponovi, kjer je neškodljivo; sicer 08S01"]Slika: Gonilnik najprej presodi status HTTP, nato obliko, ki je pričakovana za poslano zahtevo. Vsebino in obliko uspeha opisuje Kako iz storitve OData nastane relacijski model ODBC.
Odgovor HTTP sam po sebi ni rezultat v smislu ODBC: lahko vsebuje podatke, zavrnitev storitve, sporočila podatkovne zbirke ali obliko, s katero gonilnik ne zna ničesar narediti. Ta stran za vsak razred odgovorov določa, katero povratno kodo dobi aplikacija, kateri diagnostični zapisi (SQLSTATE, izvorna številka napake, besedilo) nastanejo in v kakšnem stanju sta nato stavek in povezava.
Ključne funkcije
- Uspeh samo pri ustrezni obliki:
200z neberljivo ali nepričakovano vsebino ni uspeh. - Sporočila podatkovne zbirke kot prek neposredne povezave: številka, SQLSTATE in besedilo za vsako sporočilo.
- Brez izmišljenih rezultatov: prekinjen odgovor ali odgovor, ki ga je storitev skrajšala, se ne javi kot popoln.
Osnovni pojmi
Razredi odgovorov
| Razred | Prepoznan po | Vrnjeno aplikaciji | Diagnostični zapis | Stanje nato |
|---|---|---|---|---|
| Podatki | 2xx, zbirka z value (branje) oziroma columns (prepustna pot) | SQL_SUCCESS; vrstice prek SQLFetch | nobenega | kazalec odprt |
| Sprememba izvedena | 2xx na POST, PATCH, DELETE | SQL_SUCCESS, SQLRowCount = 1 (dejanja za tabele brez ključa: navedeno število) | nobenega | – |
| Sprememba ne zadene nobenega zapisa | 404 ali 412 na PATCH/DELETE | SQLRowCount = 0 – Access iz tega prikaže svoj konflikt pri pisanju | nobenega | – |
| Storitev zahteva 2FA | 401 z WWW-Authenticate: Wkl-Totp | po vnosu kode rezultat ponovljene zahteve; brez pogovornega okna SQL_ERROR | 28000 s sporočilom storitve | – |
| Izbrati je treba identiteto | 403 z X-Wkl-Roles | po izbiri rezultat ponovljene zahteve; brez pogovornega okna SQL_ERROR | 28000 | – |
| Prijava zavrnjena | drugi 401 ali 403 | SQL_ERROR | 28000, izvorna številka = status HTTP | – |
| Sporočila podatkovne zbirke | 4xx z error.details, katerih code je število | SQL_ERROR | en zapis na sporočilo, največ 20: SQLSTATE iz sqlState (če manjka: 42000), izvorna številka = številka sporočila, besedilo sporočila | odprta transakcija ostane odprta |
| Druga zavrnitev | 4xx brez takih sporočil | SQL_ERROR | 42000, izvorna številka = status HTTP, besedilo iz error.message ali prvih 200 znakov telesa | – |
| Rezultat skrajšan | "truncated": true v odgovoru prepustne poti: uveljavila se je omejitev števila vrstic storitve | SQL_SUCCESS za prejete vrstice, nato SQL_ERROR pri naslednjem SQLFetch | HY000 „Der Dienst hat das Ergebnis nach N Zeilen gekuerzt (Zeilenobergrenze des Dienstes); es ist unvollstaendig.“ (Storitev je rezultat skrajšala po N vrsticah (omejitev števila vrstic storitve); ni popoln.) – oznaka je za vrsticami, zato je gonilnik prej ne more poznati | aplikacija obdrži že prejete vrstice; stavek se konča |
| Preusmeritev | 3xx z Location | pri branju na istem izvoru: rezultat ciljnega naslova; sicer SQL_ERROR | 08S01 s ciljem; gonilnik ne sledi preusmeritvi na drug izvor in ne ponovi preusmerjene spremembe | – |
| Časovna omejitev | 504 ali lastna časovna omejitev gonilnika | SQL_ERROR | HYT00; zahteva se ne ponovi, ker jo storitev morda še obdeluje | rezultat spremembe neznan |
| Storitev v motnji | 5xx razen 504 | SQL_ERROR | 08S01, izvorna številka = status HTTP | – |
| Transakcija razveljavljena | 409 pri zaključku | SQL_ERROR iz SQLEndTran | 40001 | nič iz transakcije ni shranjeno |
| Povezava prekinjena | ni odgovora | po ponovitvi (glejte spodaj) rezultat; sicer SQL_ERROR | 08S01 | – |
| Potrdilu se ne zaupa | napaka TLS | SQL_ERROR, brez ponovitve | 08S01 z razlogom, na primer „UntrustedRoot“ | – |
| Odgovor neuporaben | 2xx z neveljavnim JSON, brez value oziroma columns, z vrednostjo, ki se ne ujema z deklariranim tipom, ali tok, ki se konča sredi prenosa | SQL_ERROR | 08S01 s sporočilom, ki navaja pomanjkljivost | stavek se konča z napako; aplikacija obdrži že prejete vrstice |
| Napaka v gonilniku | vsaka druga izjema | SQL_ERROR | HY000 „Unerwarteter Fehler: …“ (Nepričakovana napaka: …); celotna izjema je v sledenju | – |
Odgovor, ki ima eno od teh oblik, a vsebuje eno polje več od pričakovanega, velja za ustreznega: neznana polja in anotacije gonilnik preskoči. To ga ohranja združljivega s poznejšimi različicami storitve, ima pa posledico, ki je navedena pod Omejitve.
Zakaj 08S01 za neuporaben odgovor. ODBC ne pozna lastnega SQLSTATE za „nasprotna stran ne
odgovarja v skladu s protokolom“. 08S01 („Communication link failure“) aplikaciji pove, kaj storiti:
sam stavek ni napačen, napačna je nasprotna stran; ponovitev z istim stavkom lahko uspe, ko storitev
spet pravilno odgovarja. Sporočilo ta primer loči od izpada omrežja.
Opozorila
ODBC opozorilo javi kot SQL_SUCCESS_WITH_INFO z diagnostičnim zapisom razreda 01. Ta gonilnik
ustvarja samo lastna opozorila:
| SQLSTATE | Vzrok |
|---|---|
01004 | vrednost je bila daljša od medpomnilnika aplikacije in je bila vrnjena skrajšana |
01S02 | aplikacija je zahtevala kazalec, ki ga gonilnik nima; gonilnik nadaljuje s kazalcem samo za branje naprej brez zaklepanja |
Obvestila podatkovne zbirke ob uspehu ne dosežejo aplikacije. Če podatkovna zbirka k uspešnemu
stavku pošlje sporočilo (v SQL Serverju na primer PRINT ali RAISERROR z resnostjo do 10), dobi
aplikacija prek gonilnika SQL Serverja SQL_SUCCESS_WITH_INFO s tem sporočilom. Prek tega gonilnika
aplikacija dobi SQL_SUCCESS brez sporočila: podatkovni prehod Wkl.Data.Gateway sporočila posreduje samo ob
zavrnitvi, gonilnik pa v uspešnem odgovoru nobenega ne bere. Spremljajoče obvestilo k
zavrnitvi (SQLSTATE 01000) pa se pojavi kot nadaljnji diagnostični zapis napake.
Ponovitev po prekinitvi
Če se povezava prekine brez odgovora, gonilnik zahtevo ponovi po 1 in po 3 sekundah: bralne zahteve vedno, spremembe in lastne stavke,
katerih rezultat se prebere v celoti, z istim Idempotency-Key. Ne ponovijo se prekoračena časovna
omejitev, zaključek transakcije in pretočni lastni stavek; z RETRY=OFF se ne ponovi nič.
Pri kateri storitvi je to varno, je navedeno v
Zaveze glede na vrsto storitve.
Omejitve
| Omejitev | Posledica |
|---|---|
Nadaljnji nizi rezultatov (results) in izhodne vrednosti (outputs) prepustne poti se preskočijo | samo prvi niz; SQLMoreResults takoj javi SQL_NO_DATA |
| Obvestila podatkovne zbirke k uspehu se ne posredujejo | ni SQL_SUCCESS_WITH_INFO |
Sorodne teme
- "Der Dienst hat das Ergebnis nach N Zeilen gekürzt" – kaj storiti
- "Der Dienst leitet an … um" – kaj storiti
- Kako gonilnik prevaja stavke: sporočila podatkovne zbirke – kako Access, DAO in ADO.NET prikažejo zapise
- Vklop sledenja – kako najdete sporočilo za napako