Datum / tijd-waarden voor Access SQL opmaken in Delphi

Krijg ooit de vreselijke "Parameterobject is onjuist gedefinieerd. Er is inconsistente of onvolledige informatie verstrekt"JET-fout? Hier is hoe de situatie recht te zetten.

Wanneer u een SQL-query moet maken op basis van een Access-database waar een datum (of een datum / tijd) -waarde wordt gebruikt, moet u ervoor zorgen dat de juiste opmaak wordt gebruikt.

Bijvoorbeeld, in een SQL-query: "SELECT * VAN TBL WAAR DateField = '10 / 12/2008 '" wilt u alle records uit de tabel met de naam TBL halen waar een algemeen datumveld DateField gelijk is aan 10/12/2008.

Is de bovenstaande regel duidelijk? Is dat december, 10 of oktober, 12? Gelukkig zijn we er vrij zeker van dat het jaar in de query 2008 is.

Moet het datumgedeelte van de query worden opgegeven als MM / DD / JJJJ of DD / MM / JJJJ of misschien JJJJMMDD? En spelen regionale instellingen hier een rol??

MS Access, Jet, Datum Tijd Formatteren

Bij gebruik van Access en JET (dbGo - ADO Delphi controls) de opmaak van de SQL voor de datumveld moet * altijd * zijn:

Al het andere werkt mogelijk bij beperkte tests, maar kan vaak leiden tot onverwachte resultaten of fouten op de computer van de gebruiker.

Hier is een aangepaste Delphi-functie die u kunt gebruiken om een ​​datumwaarde voor de Access SQL-query op te maken.

Voor "29 januari 1973" retourneert de functie de tekenreeks '# 1973-01-29 #'.

Toegang tot SQL-datum / tijdnotatie?

Wat betreft de datum- en tijdnotatie, is de algemene notatie:

Dit is: # year-month-daySPACEhour: minute: second #

Zodra je een geldige datumreeks voor de SQL maakt met behulp van het bovenstaande algemene formaat en het probeert met een van de gegevenssetcomponenten van Delphi als TADOQuery, ontvang je de vreselijke "Parameterobject is onjuist gedefinieerd. Er is inconsistente of onvolledige informatie verstrekt" fout tijdens runtime!

Het probleem met het bovenstaande formaat zit in het teken ":" - omdat het wordt gebruikt voor parameters in geparametriseerde Delphi-zoekopdrachten. Zoals in "... WHERE DateField =: dateValue" - hier is "dateValue" een parameter en de ":" wordt gebruikt om deze te markeren.

Een manier om de fout te "repareren" is om een ​​ander formaat voor datum / tijd te gebruiken (vervang ":" door "."):

En hier is een aangepaste Delphi-functie om een ​​tekenreeks te retourneren van een datum / tijd-waarde die u kunt gebruiken bij het construeren van SQL-query's voor Access waar u naar een datum / tijd-waarde moet zoeken:

De indeling ziet er vreemd uit, maar zal resulteren in de correct opgemaakte datum / tijd-stringwaarde die in SQL-query's moet worden gebruikt!

Hier is een kortere versie die de routine FormatDateTime gebruikt: