Changes to the OData ODBC driver
What changes for applications and operators, per driver version.
0.8.5 (November 4, 2026)
- Views without a substitute primary key. For a view without an index, the driver no longer reports one to Access, matching Microsoft's SQL Server driver, which doesn't either. Previously, the key the data service derives for such a view from its tables appeared as the primary index
PK_<view>. An application that creates its own unique index for the view after linking it (CREATE UNIQUE INDEX … ON <view>) then failed with error 3283, „Primary key already exists.“. As with Microsoft's driver, Access shows Select Unique Record Identifier when you link such a view by hand. Tables keep their primary index. With an OData service that doesn't describe indexes, the key of every object (table or view) is still reported as its primary index. - One saved key for all schemas of a data source. The driver saves the personal key one level above the service root, which for the data service means for the data source (
…/odata/v4/<alias>/) rather than for each schema. A saved key therefore applies to every schema of the data source; previously it applied only to the schema it was saved for. A key saved earlier at the service root still applies.
0.8.4 (November 4, 2026)
- Missing rights without a sign-in dialog. If the service rejects a sign-in with
403(insufficient rights or a sign-in rule that blocks this device or time), the driver reports it to the application as28000with the service's reason. It no longer opens the Connect dialog for this, even if the application asks for it: signing in with other credentials doesn't help the user here and only invites trying one account after another. An unknown or expired key (401) still opens the dialog.
0.8.3 (2026-11-03)
- No dialog when the service can't be reached. If the service can't be reached (no connection, no answer), the driver reports
08S01with the reason to the application instead of opening the Connect dialog. A linked table in Access whose service is down now shows the error once instead of opening the dialog again after every Cancel. In this case, the driver opens the dialog only when the application explicitly asks for it (SQL_DRIVER_PROMPT). A rejected sign-in still opens it wherever the application allows a dialog. - Only one driver dialog at a time. If the application calls the driver again while one of its dialogs is open (Access does this, for example, when it repaints a linked table), the driver doesn't open a second dialog inside it but answers that call as if the user had canceled. Previously, dialogs could open inside each other until Access crashed with a stack overflow.
0.8.2 (2026-11-02)
- Waiting for a busy service. If the service answers with
429or503, the driver waits on reads asRetry-Aftersays and asks again instead of failing with3146; a report or export over a large linked table now completes against a service with a request limit too. If the service stays busy, the driver reportsHYT00with the service's wait time (previously42000). A busy service no longer opens the Connect dialog when connecting. See Limits.
0.8.1 (2026-11-02)
- Larger pages for narrow rows. When reading, the driver asks for a page size based on the width of the selected columns (
Prefer: odata.maxpagesize, up to 10,000 rows). When Access reads only the keys of a table, for example for a dynaset or a grouped list in server mode, a service that honors the preference needs a tenth of the requests. Wide rows are read as before, in the service's page size. - Constants in the select list and
UNION/UNION ALLwithout an address for custom statements. Access sendsSELECT 1 FROM t WHERE …and union queries over two linked tables of the same service as one statement to the driver, because the driver reports the language of ODBC Driver 18. Until now the driver refused them („Expressions in the select list are supported only with aggregate functions“, „'SELECT' expected“). Now it reads each part with its own condition as an OData query, inserts the constants, appends the parts, removes duplicate rows forUNION, and sorts by anORDER BYafter the last part. With an address for custom statements, aUNIONstill goes to the database unchanged. - Inner join without an address for custom statements. Access sends a join of two linked tables of the same service as a list of tables with the condition in
WHERE; the driver refused it („Queries over several tables aren't supported“). Now it reads the first table with its own condition and each further table only for the join values found (in blocks), joins the rows, counts and sorts them. Text joins without regard to case, as under SQL Server. Outer joins and totals over a join still need an address for custom statements. - A table name with a database or another schema is no longer silently reinterpreted. The driver translated
SELECT … FROM other_db.dbo.tandSELECT … FROM other_schema.titself and read the tabletof its own service root. Now such a statement goes to the address for custom statements, like any statement the driver doesn't translate: with thesqlright, the data service runs it as ODBC Driver 18 does; without that right, it rejects it as a checked statement. Without that address, the driver answers42000.dbo.tstays the tabletwhen the root serves the schemadbo. - Procedure calls with
{call …}and{? = call …}. The driver translates the clause toEXECand sends it to the address for custom statements. Previously it went to the database unchanged, and SQL Server rejected it with42000. - Output and return parameters.
SQLBindParameteracceptsSQL_PARAM_OUTPUTandSQL_PARAM_INPUT_OUTPUT; as with ODBC Driver 18, the values are in the buffers as soon asSQLMoreResultsreportsSQL_NO_DATA, and right after execution for a statement without a result set. Previously the driver answeredHYC00. - Multiple result sets.
SQLMoreResultsreturns the next set of a passed-through statement; previously it reportedSQL_NO_DATAimmediately. - Columns before execution. After
SQLPrepare, the service describes a passed-through statement without running it; previously the driver reported zero columns there. See Limits. - Types as with ODBC Driver 18. Where the service names the database type (
Store.Type), the driver describesvarchar,char, andtextas narrow instead of asnvarchar,nchar, andntext, andtime,datetimeoffset,xml,sql_variant,hierarchyid,geography, andgeometrywith the SQL Server driver's own types. In Access, these columns appear as text, as with ODBC Driver 18:timewith fractional seconds instead of today's date,datetimeoffsetwith its offset instead of in Coordinated Universal Time. See Data types. - Values as text as with ODBC Driver 18. Fractional digits of times and timestamps in the full width of the column, decimals without a zero before the decimal point (
-.0000000001instead of-0.0000000001). - Columns without a name. A column without an alias (
SELECT COUNT(*) FROM t) no longer gets the nameExpr1000; a passed-through query shows the name fromlabeland marks an identity column withidentity. - A timestamp with an offset given as text in a condition or a change was read as local time and then written with
Z, that is, shifted by the offset. Now it keeps its offset. - Dialogs and messages in the Windows display language. The driver's dialogs and the texts of its diagnostic records follow the display language of the Windows user: German, Slovenian, or else English. Until now, both were German. SQLSTATEs and native error numbers stay the same; messages of the service and of the database are passed on unchanged. German messages now use umlauts (
gültiginstead ofgueltig); an application that evaluates errors checks the SQLSTATE, not the text. See Language of the messages.
0.8.0 (2026-10-28)
- New keyword
APP. The application names itself and its version (APP=CustomerManager/2.4.1); the driver sends this with every request in the headerX-Wkl-Application. A service with database updates applies an update that breaks older versions only once no older version is still asking. WithoutAPP, the connection counts as unknown there. A value of another form is not sent; the connection still succeeds (see connection keywords).
0.7.1 (2026-10-23)
The driver behaves as before; what's new is the manufacturer information, the signature, and the mandatory texts.
- The manufacturer is EMSR DATA, D.O.O. That's what the list of installed apps and the DLL's file properties show; up to 0.7.0 they showed „The White Knight Labs“. An update still recognizes the old version.
- The DLL and the package are signed. Both DLLs (x86, x64) and the package carry the signature of EMSR DATA, D.O.O. with a timestamp. Application control can therefore allow the driver by its publisher instead of a rule per file.
- License terms before installation. Interactively, the package first shows the license terms; it installs only after you accept them (see Deploy the driver to workstations).
- Mandatory texts next to the DLL: license terms, security notice, manufacturer information, and third-party notices, each in English, German, and Slovenian.
0.7.0 (2026-10-18)
- Credentials no longer follow a redirect to another computer. Up to 0.6.0, the driver followed an HTTP redirect (
3xx) from the service automatically, and the personal key, service key, and second-factor session went along to the target. Now it follows a redirect only when reading and only to the same scheme, host, and port; otherwise the request fails with08S01and a message that names the target. A redirected change isn't repeated. - Session and Windows sign-in only to protected, own addresses. The second-factor session now goes only over
httpsor to your own computer, including to the address for custom statements (PASSTHROUGH); if a service asks for a second factor overhttp, the driver sends neither the code nor the session and reports28000. WithAUTH=WINDOWS, the driver answers a sign-in challenge (Negotiate,NTLM) only fromURLandPASSTHROUGH; up to 0.6.0, any host that a next page or a schema document named received the Windows sign-in. - Date and time literals are read exactly.
{ts '…'}accepts onlyyyyy-mm-dd hh:mm:sswith up to seven fractional digits,{t '…'}onlyhh:mm:ss. Up to 0.6.0, the driver also read forms such as{ts '06/01/2023'}and guessed which number is the month; now it treats them like any statement it doesn't translate (see Escape clauses). - Truncated results are reported. If the service truncates the result of a passed-through statement at its row limit (
"truncated": true), the driver returns the rows and then reportsHY000„Der Dienst hat das Ergebnis nach N Zeilen gekuerzt …“ (The service truncated the result after N rows …). Up to 0.6.0, the truncated set arrived without notice. An application that has so far processed such results silently now receives an error. DATABASEalso through data sources. For a connection through a data source, the driver returns that data source'sDATABASE, otherwise the service root, and the setup dialog writes the service root into every data source. As a result, two data sources pointing to two service roots no longer share a connection in Access.TIMEOUTandRETRY.TIMEOUT=0means no time limit; a negative number or text fails with08001(previously a silent 60 seconds). NewRETRY=OFF: no retry after a dropped connection, for services that don't honorIdempotency-Key.- Changed SQLSTATEs when connecting. An unusable connection string (missing or invalid
URL, invalidPASSTHROUGHorMAXURLLENGTH,ROLEtoo long) reports08001; unusable credentials (emptyAPIKEYENV, password/key/SESSIONto an unprotected address, contradictory settings, unknownAUTH) report28000. Previously, both cases returnedIM002, which the ODBC specification reserves for the Driver Manager. An application that checks forIM002to detect a validation error of the driver must be adapted. - Documentation. New: Security model and trust boundaries, Standards and specifications, How an OData service becomes a relational ODBC model, How the driver classifies and reports responses, the Differences from ODBC Driver 18, and the behavior of transactions on errors. Corrected: tracing writes the field values when adding and changing records;
{call …}fails with SQL Server even with pass-through. New troubleshooting pages for the messages „Der Dienst hat das Ergebnis nach N Zeilen gekürzt“ and „Der Dienst leitet an … um“ (The service redirects to …).
0.6.0 (2026-10-13)
- First version with a fixed version number: the DLL file version,
SQLGetInfo(SQL_DRIVER_VER), and the installation package carry the same version; tracing names the build. - Features: reading, filtering, sorting, counting, and paging on the service; adding, changing, and deleting with write conflict detection through
If-Match; grouping through$apply;OFFSET/FETCH; pass-through of statements that can't be translated; transactions where the service offers them; database messages with number and SQLSTATE; sign-in with a Windows account, name and password, personal key, and second factor. - Contains the fix of 2026-10-07 for tables with a key of type
uniqueidentifier: previously, Access showed#Deleted(see Access reports "Record is deleted" for a GUID key).
en/wiki/data-conectivity/odata-odbc/changelog.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille