Formatage des valeurs de date et d'heure pour Access SQL dans Delphi

Obtenez jamais l'horrible "L'objet paramètre est mal défini. Des informations incohérentes ou incomplètes ont été fournies"Erreur JET? Voici comment corriger la situation.

Lorsque vous devez créer une requête SQL sur une base de données Access dans laquelle une valeur de date (ou de date / heure) est utilisée, vous devez vous assurer que la mise en forme correcte est utilisée.

Par exemple, dans une requête SQL: "SELECT * FROM TBL WHERE DateField = '10 / 12/2008 '", vous souhaitez obtenir tous les enregistrements de la table nommée TBL où un champ de date général DateField est égal au 10/12/2008.

La ligne ci-dessus est-elle claire? Est-ce le 10 décembre ou le 12 octobre? Heureusement, nous sommes à peu près sûrs que l'année de la requête est 2008.

La partie date de la requête doit-elle être spécifiée comme MM / DD / YYYY ou DD / MM / YYYY ou peut-être YYYYMMDD? Et les paramètres régionaux jouent-ils un rôle ici?

Formatage MS Access, Jet, Date et heure

Lorsque vous utilisez Access et JET (contrôles dbGo - ADO Delphi), le formatage du SQL pour le champ de date devrait * toujours * être:

Tout le reste peut fonctionner dans des tests limités mais peut souvent conduire à des résultats inattendus ou à des erreurs sur la machine de l'utilisateur.

Voici une fonction Delphi personnalisée que vous pouvez utiliser pour formater une valeur de date pour la requête Access SQL.

Pour "29 janvier 1973", la fonction renverra la chaîne '# 1973-01-29 #'.

Accéder au format d'heure de date SQL?

Quant au formatage de la date et de l'heure, le format général est:

C'est: # année-mois-jour ESPACEheure: minute: seconde #

Dès que vous construisez une chaîne de date-heure valide pour le SQL en utilisant le format général ci-dessus et que vous l'essayez en utilisant l'un des composants de l'ensemble de données de Delphi comme TADOQuery, vous recevrez la terrible "L'objet de paramètre est mal défini. Des informations incohérentes ou incomplètes ont été fournies" erreur au moment de l'exécution!

Le problème avec le format ci-dessus est dans le caractère ":" - car il est utilisé pour les paramètres dans les requêtes Delphi paramétrées. Comme dans "… WHERE DateField =: dateValue" - ici "dateValue" est un paramètre et le ":" est utilisé pour le marquer.

Une façon de "corriger" l'erreur consiste à utiliser un autre format pour la date / l'heure (remplacer ":" par "."):

Et voici une fonction Delphi personnalisée pour renvoyer une chaîne à partir d'une valeur date-heure que vous pouvez utiliser lors de la construction de requêtes SQL pour Access où vous devez rechercher une valeur date-heure:

Le format semble étrange mais entraînera la valeur de la chaîne de date et d'heure correctement formatée à utiliser dans les requêtes SQL!

Voici une version plus courte utilisant la routine FormatDateTime: