Je suis en train de modifier une DLL afin de passer notre stockage de données de DBase vers MSSQL.
Aprés quelques recherches, je suis tombé sur ces deux fonctions :
procedure MaConnectComplete(Connection: TADOConnection;const Error: Error; var EventStatus: TEventStatus); procedure MaConnectionExecuteComplete(Connection:TADOConnection;RecordsAffected: Integer; var EventStatus: TEventStatus; const Command: _Command;const Recordset: _Recordset);
procedure TReadWriteDBFile.MaConnectComplete(Connection: TADOConnection;const Error: Error; var EventStatus: TEventStatus); begin adoCommand1:=TADOCommand.Create(nil); ConsoleTrace('Activation de la table EVENEMENT (SQL)', DebuggLevel1); if EventStatus=esErrorsOccured then Begin //Une fois DBase supprimer, ajouter ici la partie secours de la base EVENT ConsoleTrace('Problème d''activation de la table EVENEMENT (SQL). Passage en mode secours.', DebuggLevel1); End else begin with adoCommand1 do begin Connection:=adoCo; ExecuteOptions:=[eoAsyncExecute]+[eoExecuteNoRecords]; Execute; ConsoleTrace('Activation de la table EVENEMENT (SQL) OK', DebuggLevel1); end; end; end;
J'ai donc effectué différents tests avec ces dernières. Elles marchent correctement sur mon autre programme. Aucun problème à signaler jusques la.
J'ai donc essayé d'utiliser ces fonctions dans ma DLL, la ou leur utilisation m’intéresse vraiment. C'est la que les problèmes commencent.
Je pense que toutes les erreurs que j'ai découlent de celle la :
E2005 'Error' n'est pas un identificateur de type
La déclaration est identique mais :
E2037 La déclaration de 'MaConnectComplete' diffère de la déclaration précédente
J'ai bien un composant AdoCommand de déclaré mais :
E2003 Identificateur non déclaré : 'adoCommand1'
J'ai bien un composant AdoConnection de déclaté, que j'utilise d'ailleurs plus loin dans mon développement mais :
E2003 Identificateur non déclaré : 'adoCo'
Je passe le reste puisque c'est redondant par rapport a celles citées au dessus.
Enfin, à partir du moment au j'essaie d'utiliser une des deux fonctions :
E2009 Types incompatibles : 'Les listes de paramètres diffèrent'
Je serais disponible un maximum pour toute information complémentaire à celui qui voudra bien me venir en aide.
En espérant apercevoir un jour la lumière au bout du tun-DLL, je vous remercie par avance pour l'aide que vous pourrez m'apporter.
ça va pas être simple parce qu'il manque justement le plus important la déclaration de "Error" !!!
de quel type sagit-il ?
et de toute manière ceci:"const Error: Error;" me parait être, pour le moins, très ambigu
tu devrais avoir quelque chose comme ça "const Error: TError;"
et 'adoCommand1' & 'adoCo' sont bien inconnus du bout de code que tu donnes ;-)
Cordialement,
Je viens d'essayer avec Const Error: TError, bien sur ça serait trop simple si ça marchait.
Je viens de regarder dans la doc pour comprendre de quel type il s'agit mais pas d'information sur ce point.
L'exemple suivant est une opération traditionnelle de modification de données. Comme elle peut être lourde, on la traite de manière asynchrone.
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Déclarations privées } procedure MaConnectComplete(Connection: TADOConnection; const Error: Error; var EventStatus: TEventStatus); procedure MaConnectionExecuteComplete(Connection: TADOConnection; RecordsAffected: Integer; const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); public { Déclarations publiques } end; var Form1: TForm1; adoConnection:TADOConnection; adoCommand:TADOCommand; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin adoConnection:=TADOConnection.Create(nil); with adoConnection do begin ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\NWind.mdb;'; ConnectOptions:= coAsyncConnect; OnConnectComplete:=MaConnectComplete; OnExecuteComplete:=MaConnectionExecuteComplete; Connected:=True; end; end; procedure TForm1.MaConnectComplete(Connection: TADOConnection; const Error: Error; var EventStatus: TEventStatus); begin adoCommand:=TADOCommand.Create(nil); if EventStatus=esErrorsOccured then MessageDlg('Erreur lors de la connexion',mtError,[mbOK],0) else begin with adoCommand do begin Connection:=adoConnection; CommandText:='UPDATE Clients Set Pays = ' + QuotedStr('États-Unis')+' WHERE Pays = '+QuotedStr('USA'); ExecuteOptions:= [eoAsyncExecute]+[eoExecuteNoRecords]; Execute; end; end; end; procedure TForm1.MaConnectionExecuteComplete(Connection: TADOConnection; RecordsAffected: Integer; const Error: Error; var EventStatus: TEventStatus; const Command: _Command; const Recordset: _Recordset); begin MessageDlg(IntToStr(RecordsAffected)+' modifications effectués',mtInformation,[mbOK],0); end; end.
Le cheminement est simple, à la création de la feuille je démarre une connexion asynchrone, lorsque celle-ci est complète elle lance s'il n'y a pas d'erreur la commande. Lorsque celle ci est
terminée, un message précise le nombre de modifications effectuées. Il y a trois avantages important avec ce style de programmation.
Votre code peut exécuter autre chose pendant que les opérations de longue durée ont lieu.
Vous êtes moins dépendant de la charge éventuelle du serveur.
Les événements contiennent tous les paramètres nécessaires à la construction d'un code robuste.
je me doute que ça n'a pas fonctionné c'était juste pour soulever le coté ambigu de la déclaration avec Error: Error; le compilateur ne sait pas qui est le type de la variable.
et si tu fait ceci:
uses ADOInt;
procedure MaConnectComplete(Connection: TADOConnection;const Error: ADOInt.Error; var EventStatus: TEventStatus);
et même ceci devrait fonctionner
uses ADOInt;
procedure MaConnectComplete(Connection: TADOConnection;const aError: Error; var EventStatus: TEventStatus);
J'ai essayé les deux, Adoint. marche impeccable, plus d'erreur. Pour aErreur, ça n'a pas marché par contre.
Je n'ai pas d'application hote pour le moment donc je ne peux pas tester mais "ça compile".
Un grand merci. Je reviendrais surement vers le forum pendant le cours de mon développement, pour des problèmes plus ou moins poussés. (La programmation Delphi/Siemens/SGBD ... On est pas dans la merde.)
il est temps alors d'en créer une pour tester ... parce qu'à mon avis d'autres problèmes risque d'apparaitre.
Un grand merci. Je reviendrais surement vers le forum pendant le cours de mon développement, pour des problèmes plus ou moins poussés. (La programmation Delphi/Siemens/SGBD ... On est pas dans la merde.)
Si c'est dans mes cordes je le ferais avec plaisir ;)
Si tu veux, pour t'expliquer un peu le contexte, l'appli ne tourne pas sur un PC, mais sur un poste un peu particulier. Ce poste permet de convertir les données automate vers une BDD grâce à cette DLL. Une appli présente sur le PC fait appel à la DLL, mais je n'ai pas la main dessus. Je ne peux pas directement tester sur le PC mais dois en faire une copie pour ne pas impacter la production ...
Enfin, je n'ai absolument aucune connaissance de l'appli sur le poste, je n'ai aucune connaissance en programmation automate, ... je ne suis donc pas super à l'aise pour le moment. Mais ça va venir.
Cordialement. (Et oui, je sais très bien au vu des modifications à l'arrache que j'ai fait pour le moment, des problèmes viendront avec le temps et les tests.)