Omejitve in znane pomanjkljivosti
Česa gonilnik OData ODBC ne zmore ali kaj počne drugače kot gonilnik ODBC SQL Serverja, in zakaj. Vsaka omejitev navaja, kje je opisana rešitev.
Omejitve
- Samo OData v4 z JSON. OData v2/v3 in storitve brez
$metadataniso podprte. - 32- in 64-bitna različica: 32-bitna aplikacija naloži samo gonilnik x86, 64-bitna aplikacija samo gonilnik x64. Namestitveni paket namesti oba; zahteva 64-bitni Windows.
- Transakcije samo, kjer jih storitev podpira. Če storitev v
$metadatadeklarira naslov za transakcije (Store.Transactions, tako na primer podatkovni prehod Wkl.Data.Gateway),BeginTrans,CommitTransinRollbackv VBA/DAO terBeginTransactionv ADO.NET delujejo kot prek gonilnika SQL Serverja. Brez te deklaracije gonilnik ne javlja podpore za transakcije: ADO.NET priBeginTransactiondobi napakoHYC00, Access paBeginTransv tem primeru obdrži zase –Rollbackna storitvi ničesar ne razveljavi. Če se povezava prekine medCommitTrans, ni znano, ali je bilo shranjeno. Kako to preverite pred uporabo in kaj se zgodi pri napakah, je opisano v Transakcije. - Na zasedeno storitev gonilnik počaka. Če storitev na branje odgovori s
429(preveč zahtev) ali503(začasno ni na voljo), gonilnik počaka toliko, kolikor poveRetry-After, in vpraša znova; brez tega podatka počaka 1, 2, 4, 8 in 16 sekund. Posamezne čakalne dobe nad 60 sekund ali skupno več kot 120 sekund ne počaka, temveč javiHYT00s časom storitve. Zasedena storitev ne odpre pogovornega okna Poveži.RETRY=OFFizklopi tudi čakanje. - Ponovitev po prekinitvi povezave je vklopljena. Gonilnik bralne in pisalne zahteve ponovi po 1 in 3 sekundah; pri pisanju je to varno samo, če storitev upošteva
Idempotency-Key. Za storitev, ki tega ne počne, ponovitev izklopite zRETRY=OFF. Glejte Zaveze glede na vrsto storitve. CommandBuilderADO.NET v privzeti nastavitvi potrebuje prepustno pot ali drugo pravilo sočasnosti; glejte ADO.NET in Visual Studio.- ADO.NET
DateTimeprenese samo na milisekundo; glejte ADO.NET in Visual Studio. - Samo kar je mogoče prevesti – ali posredovati. Stavek, ki ne ustreza poizvedbi OData, se zavrne, če povezava ne navaja naslova za lastne stavke (glejte Kako gonilnik prevaja stavke). Gonilnik v nobenem primeru tiho ne naloži cele množice entitet, da bi lokalno filtriral.
- Urejanje brez ključa samo, če ga storitev podpira. Množica entitet brez ključa je samo za branje, razen če
$metadatazanjo deklarira dejanjiUpdateByOriginalinDeleteByOriginal. Tedaj Access zapis navede z njegovimi starimi vrednostmi; enaki zapisi ostanejo nespremenljivi. - Spreminjanje in brisanje potrebujeta različico vrstice, ki jo deklarira storitev. Če jo deklarira – shranjen stolpec ali izračunano vrednost –, jo Access uporabi kot edini dodatni pogoj, gonilnik pa iz nje naredi
If-Match; konflikt pri pisanju se v tem primeru v Accessu pojavi kot tak. Če je ne deklarira, Access v pogoj postavi stare vrednosti vseh stolpcev. Tega v OData ni mogoče izraziti, zato gonilnik to zavrne, namesto da bi preverjanje tiho opustil: sicer bi sprememba prepisala spremembo nekoga drugega, čeprav Access predpostavlja, da je to izključeno. Ustvarjanje je mogoče tudi brez različice vrstice. Rešitev zagotovi storitev, ne gonilnik: deklarira različico vrstice ali izračunan žig. - Preveden stavek bere natanko eno množico entitet; spoji in podpoizvedbe se izvedejo samo prek prepustne poti, glejte Podprti SQL.
LIKEsamo v oblikahx%,%x,%x%in brez_kot nadomestnega znaka ([_]in ubežni znak sta dovoljena); glejte Podprti SQL.- Kazalec bere naprej, brez zaznamkov in brez zaklepanja.
- Nekaj znakov ostane v imenu kodiranih (
!,",.,[,],`, krmilni znaki, presledki na začetku); glejte Odpravljanje težav. - Ime z več kot 64 znaki v Accessu ne uspe, kot prek gonilnika SQL Serverja; glejte Odpravljanje težav.
- Access deli povezave po
DATABASE. Dve povezani tabeli z enakimDATABASEuporabljata isto povezavo, tudi pri različnemURL– in v tem primeru tiho bereta in pišeta podatke prvega korena storitve. Gonilnik o tem ne izve ničesar in tega ne more preprečiti; pravilo za nastavitev je v Več korenov storitve v eni datoteki. Prav tako si povezavo delijo povezane tabele, ki se razlikujejo samo vROLE=; v tem primeru velja identiteta podatkovne zbirke prve povezave. Različni koreni storitve in druga identiteta v isti seji zato potrebujejo različne vrednostiDATABASE; gonilnik eno dopolni, če je niz ne navaja. Glejte Niz povezave gonilnika. - Pogovorno okno se pojavi samo, kjer ga aplikacija dovoli: z oknom in ne s
SQL_DRIVER_NOPROMPT. Brez okna storitev nepopolno povezavo zavrne. Če Access odpre povezano tabelo brez shranjenega gesla, se gonilnik prijavi z nazadnje uporabljenim imenom, katerega geslo je shranjeno s „Shrani geslo“; sicer vpraša s kratkim obrazcem za prijavo. Po „Prekliči“ za isto storitev pet sekund ne vpraša znova. - Access ob neuspeli vzpostavitvi povezave prikaže samo DAO 3151; glejte Odpravljanje težav.
- Posredovan stavek storitev opiše pred izvedbo. Če aplikacija med
SQLPrepareinSQLExecutevpraša po stolpcih, gonilnik pridobi opis od storitve, ne da bi stavek izvedel. To stori samo, če storitev naslov za lastne stavke navede sama (Store.PassThrough); z naslovom izPASSTHROUGHin pri stavku, ki ga SQL Server brez izvedbe ne more opisati (začasne tabele), gonilnik do izvedbe javi nič stolpcev. - Vrstico za vrstico pride samo prvi niz rezultatov. Vsak nadaljnji niz posredovanega stavka prispe s koncem prvega in ostane v pomnilniku, dokler ga aplikacija ne doseže s
SQLMoreResults. Velik niz zato postavite na prvo mesto v proceduri. - DAO
GetRowsob napaki pri nadaljnjem branju obvisi – s katerim koli gonilnikom; glejte Odpravljanje težav. - Posredovan stavek se prebere v celoti. Naslednjih strani ni: množico določa stavek sam, storitev pa jo omeji s svojo omejitvijo števila vrstic. Če ta omejitev učinkuje, gonilnik posreduje prejete vrstice in nato javi
HY000„Storitev je rezultat skrajšala po N vrsticah …“; Access to prikaže kot „ODBC–call failed“. Glejte Razvrščanje odgovorov. - Pojavijo se samo deli modela OData, ki jih je mogoče preslikati. Kompleksne vrednosti, zbirke, razmerja, singletoni, funkcije in podedovane lastnosti v katalogu manjkajo; glejte Kako iz storitve OData nastane relacijski model ODBC.
- Vezana binarna vrednost se prenese kot besedilo. Na prepustni poti se poda kodirana v base64; če mora stavek primerjati binarno vrednost, jo zapišite neposredno v stavek.
Delovanje
- Sledenje: za iskanje napak služita sledenje gonilnika in sledenje upravitelja gonilnikov; glejte Vklop sledenja. Sledenje ima datoteko odprto, dokler se proces izvaja, in vsako vrstico zapiše takoj.
- Klic blokira nit aplikacije kot pri izvornem gonilniku, dokler odgovor ne prispe, in medtem ne obdeluje sporočil oken. Dogodki aplikacije, na primer „On Current“ podatkovnega lista v Accessu, zato se nikoli ne sprožijo sredi klica gonilnika.
- Potrdila: prek
httpsgonilnik potrdilo preveri v shrambah potrdil Windows, brez stikala za izklop; potrdilo, ki mu ni zaupano, povzroči08S01, zahteva pa se ne ponovi. Glejte 08S01 "UntrustedRoot". Spremembe sheme: gonilnik naloži
$metadataenkrat na povezavo in ga hrani, dokler se povezava ne zapre. Če se shema storitve spremeni, medtem ko je aplikacija povezana:Sprememba Posledica do ponovne vzpostavitve dodan stolpec ali tabela ni vidno stolpec odstranjen ali preimenovan zahtevo, ki ga navaja, storitev zavrne; aplikacija dobi sporočilo storitve pravica odvzeta storitev zavrne ( 403), tudi če je tabela še prikazanaPonovna vzpostavitev v Accessu pomeni: zaprite Access in ga znova odprite, nato v „Linked Table Manager“ posodobite zadevne povezane tabele; šele takrat Access nove stolpce in tipe prevzame v povezavo.
Odstopanja od ODBC Driver 18
Če aplikacijo z gonilnika ODBC za SQL Server (ODBC Driver 18) preselite na ta gonilnik, prepustna pot vrne enake vrednosti povsod, kjer oba gonilnika vrneta rezultat. Na naslednjih področjih se ta gonilnik vede drugače, tako v različici x86 kot x64:
| Področje | ODBC Driver 18 | ta gonilnik |
|---|---|---|
Izhodni parametri tipa decimal, numeric | z natančnostjo in merilom vezave | kot decimal(38,10): več kot deset decimalnih mest se zaokroži |
Izhodni parametri tipa datetimeoffset | z zamikom | brez zamika |
Izhodni parametri kot podatkovni tok (SQL_PARAM_OUTPUT_STREAM) | podprti | HYC00 |
Števci spremenjenih vrstic med nizi rezultatov (brez SET NOCOUNT ON) | vsak svoj rezultat za SQLMoreResults | preskočeni; SQLMoreResults skoči na naslednji niz s stolpci |
Stolpci po SQLPrepare z naslovom iz PASSTHROUGH | opisani | nič stolpcev do izvedbe |
varchar(max) | SQL_VARCHAR z dolžino 0 | SQL_LONGVARCHAR z dolžino 2.147.483.647 (namerno, glejte Podatkovni tipi) |
| Stolpec brez imena ali s ponovljenim imenom v posredovani poizvedbi | prazno oziroma ponovljeno ime | ime iz label; storitev brez label določi lastna imena (na primer Column2, Nummer1), glejte Zahteve za storitev OData |
xml v posredovani poizvedbi | shranjeno besedilo | besedilo, ki ga vrne storitev; podatkovni prehod Wkl.Data.Gateway prazen element zapiše kot <r /> namesto <r/> (isti dokument) |
Polja deskriptorjev (SQLGetDescField, SQLSetDescField) | vodena | HYC00 |