Kako iz storitve OData nastane relacijski model ODBC
graph TD
M["$metadata (CSDL)"] -->|"ob prvi uporabi povezave"| R["Model gonilnika: množice, stolpci, ključi, anotacije"]
R --> K["Katalog za aplikacijo: SQLTables, SQLColumns, SQLStatistics"]
R --> P["Prevod stavka v zahtevo OData"]
P -->|"HTTP"| A["Odgovor JSON"]
A --> E{"Razvrstitev odgovora"}
E -->|"zbirka value"| Z["Vrstice: lastnost dodeljena stolpcu po imenu"]
E -->|"@odata.nextLink"| F["naslednja stran"]
E -->|"error"| D["Diagnostični zapisi"]
E -->|"druge anotacije"| I["preskočeno"]Slika: Gonilnik pomen vsakega elementa izpelje iz dokumenta metapodatkov in vrste zahteve, ne iz oblike JSON. Razvrščanje odgovorov opisuje stran Kako gonilnik razvršča in javlja odgovore.
OData podatke opisuje kot entitete s tipi, ključi, gnezdenimi vrednostmi in razmerji; ODBC pozna samo tabele iz vrstic in stolpcev s tipom SQL. Gonilnik zato preslika samo tisti del modela OData, ki ga je mogoče brez izgube pomena prikazati kot tabelo, preostanek pa izpusti tako, da je to razvidno. Ta stran za vsako vrsto elementa navaja, kaj gonilnik iz njega naredi. Ta stran je podlaga za vse, kar opisuje stran Podprti SQL: rezultatu lahko zaupate šele, ko je jasno, kateri stolpec ustreza kateri lastnosti.
Ključne funkcije
- Množica entitet je tabela, lastnost s preprostim tipom je stolpec, ključ tipa entitete je primarni ključ.
- Tip pride iz
$metadata, ne iz JSON: število, ki prispe kot besedilo, ostane število; vrednost, ki se ne ujema z deklariranim tipom, je napaka, ne tiha pretvorba. - Kar ni mogoče prikazati kot stolpec, vidno manjka: kompleksne vrednosti, zbirke in razmerja se ne pojavijo, namesto da bi bili sploščeni ali ponujeni kot besedilo.
- Krmilni podatki niso podatki:
@odata.nextLinkkrmili listanje, druge anotacije odgovora nikoli ne postanejo stolpci.
Osnovni pojmi
Kaj nastane iz dokumenta metapodatkov
Gonilnik prebere $metadata enkrat za vsako povezavo, ob njeni prvi uporabi. Osnova je format CSDL XML iz
OData 4.0/4.01 (glejte Standardi in specifikacije).
Element v $metadata | V modelu ODBC | Utemeljitev |
|---|---|---|
EntitySet | tabela, vrsta tabele TABLE | naslovljiva množica istovrstnih zapisov, nad katero je mogoče poizvedovati |
EntitySet s tipom, ki ga dokument ne opisuje | manjka | brez tipa ni stolpcev |
Property s tipom Edm.…, ki ga gonilnik preslika | stolpec; tip, dolžina in natančnost po Podatkovni tipi; Nullable="false" kot SQL_NO_NULLS | ena preprosta vrednost na zapis |
Property z drugim tipom Edm.… (Edm.Geography…, Edm.Geometry…, Edm.Duration, Edm.Stream) | manjka | ni tipa SQL, v katerega bi ga bilo mogoče preslikati brez izgube |
Property kompleksnega tipa (ComplexType) | manjka | gnezdena vrednost nima stolpca; sploščenje (Adresse_Ort) bi ustvarilo izmišljene stolpce, ki jih storitev ne more ne filtrirati ne zapisovati |
Property tipa Collection(…) | manjka | več vrednosti na zapis ni mogoče prikazati v eni celici, ne da bi se izgubil pomen |
Property naštevnega tipa (EnumType) ali TypeDefinition | manjka | gonilnik bere samo lastnosti, katerih tip je neposredno Edm.… |
Key s PropertyRef | primarni ključ in enolični indeks (SQLStatistics); Access ga prevzame kot primarni indeks | brez njega množice ni mogoče urejati |
Key, ki navaja manjkajočo lastnost | ni ključa; tabela je samo za branje | nepopoln ključ bi zadel več zapisov |
NavigationProperty | manjka; SQLForeignKeys vrne prazen rezultat | bralna pot ne sledi nobenemu razmerju; spoji so mogoči samo prek prepustne poti |
BaseType (dedovanje med tipi entitet) | se ne upošteva: izpeljani množici manjkajo lastnosti in ključ osnovnega tipa | dedovanje ni podprto |
OpenType: lastnosti, ki so samo v zapisu | manjkajo | v $metadata niso opisane |
Singleton | manjka | ni zapis v množici in nima vrstic |
FunctionImport, Function, ActionImport | manjkajo; SQLProcedures vrne prazen rezultat | klici so mogoči samo prek prepustne poti |
vezana Action UpdateByOriginal/DeleteByOriginal | spreminjanje in brisanje tabele brez ključa | razširitev, glejte Zahteve |
druga Action | preskočeno | – |
anotacija Core.Computed | stolpec samo za branje (SQL_DESC_UPDATABLE) | – |
anotacija Core.OptimisticConcurrency | stolpec velja za različico vrstice | konflikt pri pisanju prek If-Match |
anotaciji Aggregation.ApplySupported, Aggregation.CustomAggregationMethods | združevanje v skupine prek $apply | – |
anotacije besednjaka Wkl.Store.V1 | ime izdelka, shema, imena tipov, indeksi, statistika, prepustna pot, transakcije | razširitev tega izdelka |
| vsaka druga anotacija | preskočeno | – |
Imena. Gonilnik množice in stolpce javi pod imeni iz $metadata. Ime, ki ga je storitev kodirala
z _xHHHH_, dekodira, kolikor lahko Access rezultat obdela; glejte
Ime polja je prikazano kodirano ali povezovanje ne uspe.
Pogledi. OData pogleda ne razlikuje od tabele; vsaka množica se pojavi kot TABLE.
Kaj nastane iz odgovora s podatki
Bralna zahteva vrne zbirko: objekt JSON s poljem value. Gonilnik njegove dele razvrsti takole:
| Del odgovora | Pomen | V modelu ODBC |
|---|---|---|
value (polje) | zapisi strani | za vsak element ena vrstica. Če value manjka ali ni polje, je odgovor napaka (glejte Razvrščanje odgovorov) |
| lastnost zapisa, ki opisuje stolpec | vrednost | vrednost stolpca, pretvorjena po tipu iz $metadata |
lastnost, ki jo opisuje $metadata, a v zapisu manjka | vrednost ni posredovana | NULL |
null | ni vrednosti | NULL |
| lastnost zapisa, ki ne opisuje stolpca (kompleksna vrednost, zbirka, dinamična lastnost, navigacija) | – | preskočeno |
@odata.nextLink | nadaljevanje | gonilnik pridobi naslednjo stran, ko aplikacija bere naprej; nikoli stolpec |
@odata.context, @odata.count, @odata.etag in vsaka druga anotacija | krmilni podatek | preskočeno, nikoli stolpec |
Pretvorba po deklariranem tipu. Vrednost se bere po svojem tipu v $metadata, ne po obliki JSON:
"12.50" je za stolpec Edm.Decimal število 12,50, "NaN" za Edm.Double posebna vrednost. Če se
vrednost ne ujema s tipom, se branje prekine s sporočilom „Vrednost stolpca … se ne ujema z
napovedanim tipom …“; gonilnik ne ugiba drugega tipa.
Štetje. COUNT(*) se pošlje na …/$count; odgovor je število kot besedilo, ne zbirka.
Kaj gonilnik predpostavlja pri pisanju
Pri spreminjanju in brisanju gonilnik vrednost za If-Match tvori sam iz stolpca, ki ga navaja
Core.OptimisticConcurrency in ga Access pošlje kot pogoj: binarna vrednost postane W/"<Base64>",
besedilo, ki se začne z W/, ostane takšno, kot je, vsako drugo besedilo pa postane W/"<besedilo>".
Storitev mora torej sprejeti ETag te oblike; @odata.etag iz odgovora gonilnik ne bere. Podatkovni
prehod Wkl.Data.Gateway to obliko sprejme; pri drugi storitvi to preverite pred uporabo.
Kaj ni preslikano
Ni preslikano pomeni: gonilnik elementa ne prikaže in deluje naprej brez njega. Pri tem ne javi ne napake ne opozorila. Aplikacija manjkajoče dele prepozna samo po tem, da stolpca ali tabele ni v katalogu. Kjer je tak del potreben, na primer spoj prek razmerja ali klic funkcije, je na voljo prepustna pot, če jo storitev podpira.
Sorodne teme
- Kako gonilnik razvršča in javlja odgovore – uspeh, napaka, opozorilo, nepričakovan odgovor
- Kako gonilnik prevaja stavke – od SQL do zahteve
- Ubežne klavzule in podatkovni tipi – preslikava tipov podrobno
- Zahteve za storitev OData – kaj mora storitev podpirati