Änderungen am OData-ODBC-Treiber
Was sich für Anwendungen und Betreiber ändert, je Version des Treibers.
0.9.0 (5. November 2026)
- Lizenz. Der Treiber liest seine Lizenz (Datei
.licaus dem Kauf auf wvds.it) ohne Netzwerk und ohne Aktivierung, ausWKL_LICENSE_PATH,%APPDATA%\WKL\Licenses\und%PROGRAMDATA%\WKL\Licenses\. Ohne gültige Lizenz arbeitet er vollständig weiter: 30 Tage Testzeitraum, danach ein Hinweis. Der Hinweis steht im Dialog der Datenquelle, im Dialog Verbinden und im Anmeldeformular, wenn diese ohnehin aufgehen, und in der Ablaufverfolgung; keine Verbindung scheitert deswegen. Neu ist der Dialog Lizenz (Schaltfläche Lizenz…) mit dem Befehl Lizenz importieren…. Siehe So importieren Sie die Lizenz des Treibers.
0.8.5 (4. November 2026)
- Sichten ohne Ersatz-Primärschlüssel. Für eine Sicht ohne Index meldet der Treiber Access keinen Index mehr, wie Microsofts Treiber für SQL Server. Bisher erschien der Schlüssel, den der Datendienst für eine solche Sicht aus ihren Tabellen ableitet, als Primärindex
PK_<Sicht>. Eine Anwendung, die nach dem Verknüpfen einen eigenen eindeutigen Index für die Sicht anlegt (CREATE UNIQUE INDEX … ON <Sicht>), scheiterte dann mit „Der Primärschlüssel ist bereits vorhanden.“ (3283). Wie mit Microsofts Treiber fragt Access beim Verknüpfen einer solchen Sicht von Hand nach dem eindeutigen Datensatzbezeichner. Tabellen behalten ihren Primärindex. Bei einem OData-Dienst, der keine Indizes beschreibt, gilt der Schlüssel jedes Objekts (Tabelle oder Sicht) weiter als Primärindex. - Ein gespeicherter Schlüssel für alle Schemas einer Datenquelle. Den persönlichen Schlüssel speichert der Treiber eine Ebene über dem Dienststamm, beim Datendienst für die Datenquelle (
…/odata/v4/<Alias>/) statt für jedes Schema. Ein gespeicherter Schlüssel gilt so für alle Schemas der Datenquelle; bisher galt er nur für das Schema, an dem er gespeichert wurde. Ein früher am Dienststamm gespeicherter Schlüssel gilt weiter.
0.8.4 (4. November 2026)
- Fehlende Rechte ohne Anmeldedialog. Lehnt der Dienst eine Anmeldung mit
403ab (keine ausreichenden Rechte oder eine Anmelderegel, die dieses Gerät oder diese Zeit sperrt), meldet der Treiber das der Anwendung als28000mit dem Grund des Dienstes. Den Dialog Verbinden öffnet er dafür nicht mehr, auch nicht, wenn die Anwendung ihn verlangt: Eine andere Anmeldung an dieser Stelle hilft dem Benutzer nicht und lädt nur zum Durchprobieren anderer Konten ein. Ein unbekannter oder abgelaufener Schlüssel (401) öffnet den Dialog weiter.
0.8.3 (3. November 2026)
- Kein Dialog, wenn der Dienst nicht erreichbar ist. Ist der Dienst nicht erreichbar (keine Verbindung, keine Antwort), meldet der Treiber der Anwendung
08S01mit dem Grund, statt den Dialog Verbinden zu öffnen. Eine verknüpfte Tabelle in Access, deren Dienst gerade ausgefallen ist, zeigt so einmal den Fehler, statt den Dialog nach jedem Abbrechen erneut zu öffnen. In diesem Fall öffnet der Treiber den Dialog nur, wenn die Anwendung ihn ausdrücklich verlangt (SQL_DRIVER_PROMPT). Eine abgewiesene Anmeldung öffnet ihn weiter dort, wo die Anwendung einen Dialog erlaubt. - Nur ein Dialog des Treibers zur selben Zeit. Fragt die Anwendung den Treiber erneut, während einer seiner Dialoge offen ist (Access tut das etwa beim Neuzeichnen einer verknüpften Tabelle), öffnet der Treiber keinen zweiten Dialog darin, sondern beantwortet diesen Aufruf wie ein Abbrechen. Bisher konnten sich die Dialoge ineinander öffnen, bis Access mit einem Stapelüberlauf abstürzte.
0.8.2 (2. November 2026)
- Warten auf einen ausgelasteten Dienst. Antwortet der Dienst mit
429oder503, wartet der Treiber beim Lesen, wieRetry-Afteres sagt, und fragt erneut, statt mit3146abzubrechen; ein Bericht oder Export über eine große verknüpfte Tabelle läuft so auch gegen einen Dienst mit Anfragengrenze durch. Bleibt der Dienst ausgelastet, meldet der TreiberHYT00mit der Wartezeit des Dienstes (bisher42000). Ein ausgelasteter Dienst öffnet beim Verbinden nicht mehr den Dialog Verbinden. Siehe Grenzen.
0.8.1 (2. November 2026)
- Größere Seiten für schmale Zeilen. Der Treiber erbittet beim Lesen eine Seitengröße nach der Breite der ausgewählten Spalten (
Prefer: odata.maxpagesize, bis 10 000 Zeilen). Liest Access nur die Schlüssel einer Tabelle, etwa für ein Dynaset oder einen gruppierten Listen-Servermodus, braucht das bei einem Dienst, der den Wunsch beachtet, ein Zehntel der Anfragen. Breite Zeilen liest er wie bisher in der Seitengröße des Dienstes. - Konstanten in der Auswahl und
UNION/UNION ALLohne Adresse für eigene Anweisungen. Access schicktSELECT 1 FROM t WHERE …und Union-Abfragen über zwei verknüpfte Tabellen desselben Dienstes als eine Anweisung an den Treiber, weil er die Sprache von ODBC Driver 18 meldet. Bisher lehnte der Treiber sie ab („Ausdrücke in der Auswahl werden nur mit Aggregatfunktionen unterstützt“, „'SELECT' erwartet“). Jetzt liest er jeden Teil mit seiner eigenen Bedingung als OData-Abfrage, fügt die Konstanten ein, hängt die Teile aneinander, entfernt beiUNIONdoppelte Zeilen und sortiert nach einemORDER BYhinter dem letzten Teil. Mit einer Adresse für eigene Anweisungen geht eineUNIONweiter unverändert an die Datenbank. - Innerer Verbund ohne Adresse für eigene Anweisungen. Access schickt einen Verbund zweier verknüpfter Tabellen desselben Dienstes als Tabellenliste mit der Bedingung in
WHERE; der Treiber lehnte ihn ab („Abfragen über mehrere Tabellen werden nicht unterstützt“). Jetzt liest er die erste Tabelle mit ihrer eigenen Bedingung und jede weitere nur zu den gefundenen Verbundwerten (blockweise), verbindet die Zeilen, zählt und sortiert sie. Text verbindet ohne Rücksicht auf Groß- und Kleinschreibung wie unter SQL Server. Äußere Verbünde und Summen über einen Verbund brauchen weiter eine Adresse für eigene Anweisungen. - Ein Tabellenname mit Datenbank oder fremdem Schema wird nicht mehr still umgedeutet. Der Treiber übersetzte
SELECT … FROM andere_db.dbo.tundSELECT … FROM anderes_schema.tselbst und las dabei die Tabelletdes eigenen Dienststamms. Jetzt geht eine solche Anweisung an die Adresse für eigene Anweisungen, wie jede, die der Treiber nicht übersetzt: Mit dem Rechtsqlführt der Datendienst sie aus wie ODBC Driver 18; ohne dieses Recht weist er sie als geprüfte Anweisung ab. Ohne diese Adresse antwortet der Treiber mit42000.dbo.tbleibt die Tabellet, wenn der Stamm das Schemadbobedient. - Prozeduraufruf mit
{call …}und{? = call …}. Der Treiber übersetzt die Klausel inEXECund schickt sie an die Adresse für eigene Anweisungen. Bisher ging sie unverändert an die Datenbank, und SQL Server lehnte sie mit42000ab. - Ausgabe- und Rückgabeparameter.
SQLBindParameternimmtSQL_PARAM_OUTPUTundSQL_PARAM_INPUT_OUTPUTan; die Werte stehen wie bei ODBC Driver 18 in den Puffern, sobaldSQLMoreResultsSQL_NO_DATAmeldet, bei einer Anweisung ohne Ergebnismenge gleich nach dem Ausführen. Bisher antwortete der Treiber mitHYC00. - Mehrere Ergebnismengen.
SQLMoreResultsliefert die nächste Menge einer durchgereichten Anweisung; bisher meldete es sofortSQL_NO_DATA. - Spalten vor dem Ausführen. Nach
SQLPreparebeschreibt der Dienst eine durchgereichte Anweisung, ohne sie auszuführen; bisher meldete der Treiber dort null Spalten. Siehe Grenzen. - Typen wie beim ODBC Driver 18. Wo der Dienst den Typ der Datenbank nennt (
Store.Type), beschreibt der Treibervarchar,charundtextschmal statt alsnvarchar,ncharundntext, undtime,datetimeoffset,xml,sql_variant,hierarchyid,geographyundgeometrymit den eigenen Typen des Treibers von SQL Server. In Access erscheinen diese Spalten wie beim ODBC Driver 18 als Text:timemit Sekundenbruchteilen statt mit dem heutigen Datum,datetimeoffsetmit Versatz statt in koordinierter Weltzeit. Siehe Datentypen. - Werte als Text wie beim ODBC Driver 18. Nachkommastellen von Uhrzeit und Zeitpunkt in voller Breite der Spalte, Dezimalzahlen ohne Null vor dem Dezimalpunkt (
-.0000000001statt-0.0000000001). - Spalten ohne Namen. Eine Spalte ohne Alias (
SELECT COUNT(*) FROM t) hat stattExpr1000jetzt keinen Namen; eine durchgereichte Abfrage zeigt den Namen auslabelund kennzeichnet eine Identitätsspalte mitidentity. - Ein Zeitpunkt mit Versatz als Text in einer Bedingung oder einer Änderung wurde als Ortszeit gelesen und dann mit
Zgeschrieben, also um den Versatz verschoben. Jetzt behält er seinen Versatz. - Dialoge und Meldungen in der Anzeigesprache von Windows. Die Dialoge des Treibers und die Texte seiner Diagnosesätze folgen der Anzeigesprache des Windows-Benutzers: Deutsch, Slowenisch, sonst Englisch. Bisher war beides deutsch. SQLSTATE und native Fehlernummern bleiben gleich; Meldungen des Dienstes und der Datenbank kommen unverändert. Deutsche Meldungen haben jetzt Umlaute (
gültigstattgueltig); eine Anwendung, die Fehler auswertet, prüft den SQLSTATE und nicht den Text. Siehe Sprache der Meldungen.
0.8.0 (28. Oktober 2026)
- Neues Schlüsselwort
APP. Die Anwendung nennt sich und ihre Version (APP=Kundenverwaltung/2.4.1); der Treiber sendet das mit jeder Anfrage im KopfX-Wkl-Application. Ein Dienst mit Datenbank-Updates spielt ein Update, das ältere Versionen bricht, erst ein, wenn keine ältere Version mehr fragt. OhneAPPzählt die Verbindung dort als unbekannt. Ein Wert anderer Form wird nicht gesendet; die Verbindung gelingt trotzdem (siehe Schlüsselwörter der Verbindung).
0.7.1 (23. Oktober 2026)
Am Verhalten des Treibers ändert sich nichts; neu sind Herstellerangaben, Signatur und Pflichttexte.
- Hersteller ist EMSR DATA, D.O.O. So steht es in der Liste der installierten Apps und in den Dateieigenschaften der DLL; bis 0.7.0 stand dort „The White Knight Labs“. Eine Aktualisierung erkennt die alte Version trotzdem.
- DLL und Paket sind signiert. Beide DLLs (x86, x64) und das Paket tragen die Signatur von EMSR DATA, D.O.O. mit Zeitstempel. Eine Anwendungssteuerung kann den Treiber damit über den Herausgeber zulassen statt über eine Regel je Datei.
- Lizenzbedingungen vor der Installation. Interaktiv zeigt das Paket zuerst die Lizenzbedingungen; installiert wird erst nach Zustimmung (siehe So verteilen Sie den Treiber an die Arbeitsplätze).
- Pflichttexte neben der DLL: Lizenzbedingungen, Sicherheitshinweise, Herstellerangaben und Hinweise zu Fremdkomponenten, jeweils auf Englisch, Deutsch und Slowenisch.
0.7.0 (18. Oktober 2026)
- Anmeldedaten folgen keiner Umleitung an einen anderen Rechner mehr. Bis 0.6.0 folgte der Treiber einer HTTP-Umleitung (
3xx) des Dienstes selbsttätig, und persönlicher Schlüssel, Dienstschlüssel und Sitzung des zweiten Faktors gingen mit an das Ziel. Jetzt folgt er einer Umleitung nur beim Lesen und nur am selben Schema, Rechner und Port; sonst scheitert die Anfrage mit08S01und einer Meldung, die das Ziel nennt. Eine umgeleitete Änderung wird nicht wiederholt. - Sitzung und Windows-Anmeldung nur an geschützte, eigene Adressen. Die Sitzung des zweiten Faktors geht nur noch über
httpsoder an den eigenen Rechner, auch an die Adresse für eigene Anweisungen (PASSTHROUGH); verlangt ein Dienst überhttpeinen zweiten Faktor, sendet der Treiber weder Code noch Sitzung und meldet28000. MitAUTH=WINDOWSbeantwortet der Treiber eine Anmeldeaufforderung (Negotiate,NTLM) nur vonURLundPASSTHROUGH; bis 0.6.0 erhielt jeder Rechner die Windows-Anmeldung, den eine Folgeseite oder ein Schemadokument nannte. - Datums- und Zeitliterale werden genau gelesen.
{ts '…'}nimmt nurjjjj-mm-tt hh:mm:ssmit bis zu sieben Nachkommastellen an,{t '…'}nurhh:mm:ss. Bis 0.6.0 las der Treiber auch Formen wie{ts '06/01/2023'}und riet dabei, welche Zahl der Monat ist; jetzt behandelt er sie wie jede Anweisung, die er nicht übersetzt (siehe Escape-Klauseln). - Gekürzte Ergebnisse werden gemeldet. Kürzt der Dienst das Ergebnis einer durchgereichten Anweisung an seiner Zeilenobergrenze (
"truncated": true), liefert der Treiber die Zeilen und meldet danachHY000„Der Dienst hat das Ergebnis nach N Zeilen gekuerzt …“. Bis 0.6.0 kam die gekürzte Menge ohne Hinweis an. Eine Anwendung, die solche Ergebnisse bisher stillschweigend verarbeitet hat, erhält jetzt einen Fehler. DATABASEauch über Datenquellen. Der Treiber gibt bei einer Verbindung über eine Datenquelle derenDATABASEzurück, sonst den Dienststamm, und der Einrichtungsdialog schreibt den Dienststamm in jede Datenquelle. Zwei Datenquellen auf zwei Dienststämme teilen sich in Access damit keine Verbindung mehr.TIMEOUTundRETRY.TIMEOUT=0heißt ohne Zeitgrenze; eine negative Zahl oder ein Text scheitert mit08001(bisher still 60 Sekunden). NeuRETRY=OFF: keine Wiederholung nach einem Verbindungsabbruch, für Dienste, dieIdempotency-Keynicht einhalten.- Geänderte SQLSTATEs beim Verbinden. Eine unbrauchbare Verbindungszeichenfolge (fehlende oder ungültige
URL, ungültigesPASSTHROUGHoderMAXURLLENGTH, zu langeROLE) meldet08001, nicht verwendbare Anmeldeangaben (leereAPIKEYENV, Kennwort/Schlüssel/SESSIONan eine ungeschützte Adresse, widersprüchliche Angaben, unbekanntesAUTH) melden28000. Bisher kam in beiden FällenIM002, das nach der ODBC-Spezifikation dem Treibermanager vorbehalten ist. Eine Anwendung, die aufIM002prüft, um einen Prüffehler des Treibers zu erkennen, muss angepasst werden. - Dokumentation. Neu: Sicherheitsmodell und Vertrauensgrenzen, Normen und Spezifikationen, Wie aus einem OData-Dienst ein relationales ODBC-Modell wird, Wie der Treiber Antworten einordnet und meldet, die Abweichungen von ODBC Driver 18 und das Verhalten von Transaktionen bei Fehlern. Berichtigt: Die Ablaufverfolgung schreibt beim Anlegen und Ändern die Feldwerte;
{call …}scheitert bei SQL Server auch mit Durchreiche. Neue Fehlerseiten zu den Meldungen „Der Dienst hat das Ergebnis nach N Zeilen gekürzt“ und „Der Dienst leitet an … um“.
0.6.0 (13. Oktober 2026)
- Erste Version mit fester Versionsnummer: Dateiversion der DLL,
SQLGetInfo(SQL_DRIVER_VER)und Installationspaket tragen dieselbe Version; die Ablaufverfolgung nennt den Bau. - Funktionsumfang: lesen, filtern, sortieren, zählen und blättern auf dem Dienst; anlegen, ändern und löschen mit Schreibkonflikt über
If-Match; Gruppieren über$apply;OFFSET/FETCH; Durchreiche nicht übersetzbarer Anweisungen; Transaktionen, wo der Dienst sie anbietet; Meldungen der Datenbank mit Nummer und SQLSTATE; Anmeldung mit Windows-Konto, Name und Kennwort, persönlichem Schlüssel und zweitem Faktor. - Enthält die Korrektur für Tabellen mit Schlüssel vom Typ
uniqueidentifiervom 7. Oktober 2026: Access zeigte vorher#Gelöscht(siehe Access meldet bei einem GUID-Schlüssel „Datensatz ist gelöscht“).
de/wiki/data-conectivity/odata-odbc/changelog.txt · Zuletzt geändert: von Wolfgang van der Stille