Bonjour et merci pour vos réponses. Désolé, je n'ai pas pu répondre plus tôt.
Le composant TADOConnection est créé avec les options par défaut. La chaîne de connexion est la suivante :
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=****\**.mdb;Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;
Personnellement, je ne définis pas toutes ces options. Uniquement le provider et le Data Source dans le cas d'Access.
Le composant TADOQuery qui l'utilise est initialisé selon le code suivant.
1 2 3 4 5 6
| result := TADOQuery.Create(nil);
result.Connection := AConnection;
result.DisableControls;
result.CursorLocation := ACursorLocation;
if not AConnection.Connected then
AConnection.Open; |
avec ACursorLocation = clUseClient dans ce cas (et AConnection un objet de connexion permanent).
Le code qui est exécuté est le suivant :
1 2 3 4 5 6 7 8 9 10 11 12
| Query.SQL.Text := C_Query; //<-ma requête
Set_Parameter(Query, 'pFolder', false);
Set_Parameter(Query, 'pID_OT', Get_Attribute_ID_OT(AID_Attribute));
Set_Parameter(Query, 'pID_Attribute', AID_Attribute);
Query.Open;
while not Query.eof do
begin
result.Add(IntToStr(Query.Fields[0].asInteger));
Query.Next;
end;
Query.Close; |
Les fonctions Set_Parameter permettent d'assigner des valeurs ainsi que leur type au divers paramètres. J'en ai 5 ou 6 du type
1 2 3 4 5 6 7 8
| with AQuery.Parameters.ParamByName(AParameter) do
begin
DataType := ftInteger;
if (AValue>0) or not AConsider_As_ID then
Value := AValue
else
Value := NULL;
end; |
Elles ont toutes leur spécificité. Celle pour les entiers insère des NULL à la demande si l'on envoie 0, celle pour les booléens les traite comme des entiers et insère -1 ou 1 suivant le type de SGBD, celle pour les float gère les NaN, les infinites, etc, celle pour les chaînes utilise du widestring pour gérer l'internationalisation, etc. Les buts de ces fonctions sont d'une part de forcer le type du paramètre car j'ai déjà eu des soucis dans le passé en faisant une simple affectation de la valeur et pas celle du DataType et par ailleurs de diminuer la taille des codes écrits (une ligne à la place de 5 ou 6) quand vos requête d'insert ont 50 paramètres, c'est cool
Je vais tester vos diverses hypothèses.
Partager