Barvna shema: Riviera
Trenutno dejavna stran: start » sl » Dokumentacija » Integracija podatkov in dostop do podatkov » Gonilnik WKL OData ODBC » Koncepti gonilnika OData ODBC » Kako gonilnik razvršča in javlja odgovore

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: 200 z 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

RazredPrepoznan poVrnjeno aplikacijiDiagnostični zapisStanje nato
Podatki2xx, zbirka z value (branje) oziroma columns (prepustna pot)SQL_SUCCESS; vrstice prek SQLFetchnobenegakazalec odprt
Sprememba izvedena2xx na POST, PATCH, DELETESQL_SUCCESS, SQLRowCount = 1 (dejanja za tabele brez ključa: navedeno število)nobenega–
Sprememba ne zadene nobenega zapisa404 ali 412 na PATCH/DELETESQLRowCount = 0 – Access iz tega prikaže svoj konflikt pri pisanjunobenega–
Storitev zahteva 2FA401 z WWW-Authenticate: Wkl-Totppo vnosu kode rezultat ponovljene zahteve; brez pogovornega okna SQL_ERROR28000 s sporočilom storitve–
Izbrati je treba identiteto403 z X-Wkl-Rolespo izbiri rezultat ponovljene zahteve; brez pogovornega okna SQL_ERROR28000–
Prijava zavrnjenadrugi 401 ali 403SQL_ERROR28000, izvorna številka = status HTTP–
Sporočila podatkovne zbirke4xx z error.details, katerih code je številoSQL_ERRORen zapis na sporočilo, največ 20: SQLSTATE iz sqlState (če manjka: 42000), izvorna številka = številka sporočila, besedilo sporočilaodprta transakcija ostane odprta
Druga zavrnitev4xx brez takih sporočilSQL_ERROR42000, 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 storitveSQL_SUCCESS za prejete vrstice, nato SQL_ERROR pri naslednjem SQLFetchHY000 „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 poznatiaplikacija obdrži že prejete vrstice; stavek se konča
Preusmeritev3xx z Locationpri branju na istem izvoru: rezultat ciljnega naslova; sicer SQL_ERROR08S01 s ciljem; gonilnik ne sledi preusmeritvi na drug izvor in ne ponovi preusmerjene spremembe–
Časovna omejitev504 ali lastna časovna omejitev gonilnikaSQL_ERRORHYT00; zahteva se ne ponovi, ker jo storitev morda še obdelujerezultat spremembe neznan
Storitev v motnji5xx razen 504SQL_ERROR08S01, izvorna številka = status HTTP–
Transakcija razveljavljena409 pri zaključkuSQL_ERROR iz SQLEndTran40001nič iz transakcije ni shranjeno
Povezava prekinjenani odgovorapo ponovitvi (glejte spodaj) rezultat; sicer SQL_ERROR08S01–
Potrdilu se ne zaupanapaka TLSSQL_ERROR, brez ponovitve08S01 z razlogom, na primer „UntrustedRoot“–
Odgovor neuporaben2xx z neveljavnim JSON, brez value oziroma columns, z vrednostjo, ki se ne ujema z deklariranim tipom, ali tok, ki se konča sredi prenosaSQL_ERROR08S01 s sporočilom, ki navaja pomanjkljivoststavek se konča z napako; aplikacija obdrži že prejete vrstice
Napaka v gonilnikuvsaka druga izjemaSQL_ERRORHY000 „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:

SQLSTATEVzrok
01004vrednost je bila daljša od medpomnilnika aplikacije in je bila vrnjena skrajšana
01S02aplikacija 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

OmejitevPosledica
Nadaljnji nizi rezultatov (results) in izhodne vrednosti (outputs) prepustne poti se preskočijosamo prvi niz; SQLMoreResults takoj javi SQL_NO_DATA
Obvestila podatkovne zbirke k uspehu se ne posredujejoni SQL_SUCCESS_WITH_INFO

Sorodne teme

sl/wiki/data-conectivity/odata-odbc/concepts/response-processing-and-diagnostics.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille