|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
J'ai un problème dont je ne parviens pas à trouver l'origine. J'ai fait la procédure stockée suivante : Code :
Code :
Code :
Ne voyant à priori pas bien quel pourrait être ce problème SQLDA (sûrement pas une version incorrecte, puisque les appels d'autres procédures fonctionnent bien !) et ayant vérifié et re-vérifié mon nombre et types de variables (c'est vite fait, vu le nombre Dynamic SQL error SQL error code = -804 Function unknown Et encore ceci : This error is often the result of mismatched Firebird/InterBase client and servers. Make sure client and server versions of gds32.dll are the same. Je crois deviner que le code -804 est utilisé pour plusieurs types d'erreur et que, finalement, il doit y avoir quelque chose qui m'a échappé au niveau du passage des variables et de SQLDA, mais je vois de moins en moins comment résoudre le problème... Ou alors, la solution est si évidente qu'elle m'aveugle ? Quelqu'un peut éclairer ma lanterne ?
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
||||||
|
|
00
|
|
|
#2 | ||
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 379 ![]() |
avant d'aller plus loin, il faudrait régler le problème
Code :
un truc à vérifier est de cliquer droit sur "gds32.dll" et de contrôler que sa version soit directement compatible avec le serveur interbase ou firebird. pour cela il faudra voir auprès de l'administrateur du serveur si cette machine fait fonctionner interbase ou firebird et de quelle version il s'agit. avec ces infos, il sera plus facile de sélectionner la bonne "gds32.dll". a défaut et le plus simple et de recopier la "gds32.dll" du serveur sur ta machine, soit dans le dossier "system32" soit dans le même dossier que ton application. en principe cela devrait régler le problème de communication entre ton application et le serveur jj |
||
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Merci pour le tuyau Mais c'est une fausse piste ! En effet, je teste mon programme en local (il est destiné ensuite à aller chercher les données sur un serveur Linux). De plus, tout le reste du programme, y compris des appels de procédures stockées, fonctionne très bien... Je n'ai recopié ce message que pour montrer les différentes explications que j'ai trouvées concernant cette erreur -804, et qui me laissent un peu sceptque. Comme il ne peut s'agir ni d'un problème de fonction inconnue ni d'un problème de dll incompatible entre serveur et client, je me demande si c'est bien un problème de paramètres comme semble l'indiquer le message. Si c'est bien ça, c'est que quelque chose m'échappe, parce que le nombre et le type de paramètres est correct...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 379 ![]() |
ce qu'il me faudrait c'est la déclaration de votre procédure stockée, qui n'apparait pas dans le code que vous montrez. surtout les paramètres dans la clause RETURNS.
parce que l'idée suivante et qu'il y a un paramètre d'entré ou de sortie qui n'est pas adapté pour le c++ ce cas arrive par exemple lorsque le type produit et un smallint et le type attendu un integer! très con, mais cela passe la plus part du temp inaperçu, car les les programmes de visualisations s'adaptent automatiquement au type alors que votre programme non! donc si vous n'avez pas encore trouvez, pensez à contrôler soigneusement les types des données envoyées et reçues! jj |
|
|
00
|
|
|
#5 | ||||
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Merci de vous pencher sur mon problème ! Voici donc la procédure complète : Code :
Code :
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
||||
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() Inscription : décembre 2004 Messages : 379 ![]() |
l'erreur est subtile, essayez de supprimer le "suspend" de la procédure, car "suspend" indique que la procédure est en mesure de retourner des infos "ligne à ligne" dans un select, par exemple, il est possible d'appeler votre procédure par une commande sql:
alors que vous tentez de l'exécuter en tant que procédure simple. donc à votre choix: 1) vous supprimez le "suspend;" de la procédure, mais dans ce cas, vous ne pourrez plus effectuer la commande "select" mais vous conservez le code de l'application, pour autant que c'est comme cela qu'il faut appeler une procédure à partir du cpp. 2) vous changez le "execproc" par un "open" dans le programme et vous considérez alors que vôtre procédure et une "table" et vous implémentez le code en conséquence, dans ce cas laissez le "suspend" dans la procédure et implémentez dans le code la commande "select ..." comme pour lire une table "ordinaire" et faite un "fetch" pour récupérer le resultat. en principe cela devrait fonctionnez, notez que je n'est pas fait attention à d'autres erreurs éventuelles. A notez que la plus parts des programmes de visualisations utilise directement un "select" au lieu d'un execproc, c'est pour cela que cela fonctionne avec ces programmes et pas le votre. |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Merci de vous pencher sur mon problème. Malheureusement, j'ai encore des difficultés à le résoudre... J'ai tenté de supprimer le suspend. Dans ce cas, la procédure ne retourne rien dans les paramètres de sortie lorsque je la teste avec IBOConsole, ce qui parait logique, et ne renvoie pas d'erreur. Mais le programme en C++, lui, me renvoie toujours le même message... J'ai ensuite tenté un open sur mon composant SDStroredProc. Mais à ce moment-là, j'obtiens un message "error creating cursor handle" (au passage, je me demande si ce n'est pas parce que le composant attend plusieurs lignes, sinon pourquoi un curseur ?). En cherchant un peu comment je pourrais faire, par exemple en utilisant un TQuerry pour appeler ma procédure par un ordre SQL - Ce qui me chagrine quand même un peu, il me semblait préférable de l'appeler directement, mais bon, l'important est le résultat ! - je suis tombé sur ce post où un suspend est bien utilisé conjointement avec un ExecProc... Du coup, je m'interroge à nouveau sur ce que j'ai pu ne pas comprendre...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Votre procédure devrait fonctionner parfaitement (avec ou sans suspend) si vous utilisez un ExecProc.
Si vous utilisez un composant Query il faut evidemment mettre le SUSPEND. Mais à mon avis si vous êtes certain d'avoir la version de la DLL cliente correspondant à la version du serveur (Donc que vous avez utilisez le même programme d'installation pour interbase serveur et interbase client) c'est que votre probleme vient de SQLDirect tout simplement. Avez vous la dernière version de ce produit ? |
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Merci pour la réponse. J'étais effectivement en retard de version SQLDirect. J'ai réinstallé la dernière, mais hélas cela n'a pas résolu le problème : j'obtiens toujours le même message d'erreur. Pour être vraiment sûr, j'ai désinstallé et réinstallé SQLDirect et Firebird, mais sans plus de succès... Je reprécise les différents éléments utiles : - OS de développement : Windows98 SE (par habitude et par goût...) - SGBD : Firebird 1.51 superserveur local - IDE de développement : C++Builder 5 Professional - Composants d'accès au SGBD : SQLDirect version 4.1 - OS de destination : clients Windows XP Pro sur serveur Linux Serais-je donc en présence d'un bug de SQLDirect ?
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Citation:
Créez un projet de test à part posez les composants IBDataBase (double cliquez dessus pour configurer la connexion) un IBTransaction liez le au composant IBDatabase et le IBDatabase à IBTransaction et un IBStoredProc que vous liez à l'IBDatabase et à votre PS. Ca vous prendra 5 / 10 Minutes au plus. |
|
|
|
00
|
|
|
#11 | |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Citation:
Je ne suis pas sûr que ce soit le cas avec la version Pro de CBB... Je regarde si je n'ai pas les composants IB Local et s'ils conviennent...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Les IBX sont fournis avec Delphi et BC++ à partir de la version PRO.
Palette Interbase. |
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Re-bonjour,
Me revoilà, après avoir pris le temps de faire quelques essais. Effectivement, nouvel utilisateur de Firebird, j'avais essayé sans succès de me servir des composants IBX, puis m'étais dit qu'ils devaient être réservés à l'utilisation avec IBLocal et les avais viré de ma palette bien garnie ! Apparemment, j'avais dû mal faire quelque chose, car après les avoir réinstallés et utilisés pour le test que vous me préconisez, je vois qu'ils fonctionnent très bien avec Firebird Donc, je confirme : il y a apparemment bien un bug dans SQLDirect, parce que le test avec les IBX fonctionne nickel, alors qu'avec SQLDirect j'ai toujours le problème, que j'utilise Params->Items[x] ou ParamsByName(). Me reste maintenant à trouver un moyen de contourner le problème. Puisqu'apparemment ils fonctionnent bien, je me demande si je ne devrais pas utiliser les IBX plutôt que SQLDirect... A moins que quelqu'un ait un meilleur conseil ? En tous cas, merci
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Vous avez la solution d'utiliser un query.
Et de reporter le BUG à SQLDirect en espérant un correctif. A moins que vous en soyez au début de votre développement dans ce cas il peut etre interressant de refaire le point sur vos besoins de connectivité. |
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Merci beaucoup pour l'aide !
Oui, quoi qu'il en soit, je vais reporter ce bug à SQLDirect. Mais je crains que le correctif tarde un peu à arriver... Je pense que les développeurs de SQLDirect ont déjà bien du pain sur la planche ! Bien que n'en étant pas au début de mon développement, je pense que la migration ne devrait pas être trop longue ni difficile. Je vais étudier la question... J'avais opté pour SQLDirect en pensant que je n'avais rien d'inclus d'origine dans CBB me permettant d'attaquer une base firebird, mais du coup, avec la découverte du bon fonctionnement des IBX et de ce bug dans SQLDirect, je me dis que ce serait peut-être mieux de repartir sur les IBX...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Je pensais que vous aviez choisi SQLDirect pour pouvoir "attaquer" éventuellement d'autres SGBD sans devoir trop changer votre code.
Si ce n'est pas le cas mais que vous cherchez un accès natif alors les IBX sont plus adaptés. Cependant il faut savoir que Borland ne maintiendra pas une compatibilité des IBX avec Firebird. Actuellement ils fonctionnent parfaitement mais dans l'avenir il y aura certainement des différences qui feront qu'on ne pourra pas exploiter toutes les nouveautées des prochaines versions de Firebird. Donc un jour ou l'autre il faudra que vous fassiez le choix entre : 1- Ne pas faire évoluer vos serveur Firebird (concerver la version 1.5) ou 2- Ne plus utiliser les IBX mais des composants qui sont développés pour fonctionner avec Firebird. Il existe par exemple les FIBPlus http://www.consist.it/devrace.htm qui apportent déjà pas mal d'améliorations par rapport aux IBX et qui normalement devraient rester compatible avec les évolutions future de Firebird. Ils sont dispo pour Delphi / BC++ et aussi pour Kylix. Il en existe d'autre mais pour le moment si je devais migrez mes applis IBX vers quelque chose je pense que ca serait vers ces FIB+. Notamment parqu'ils proposent des composants très similaires aux IBX facilitant ainsi la migration. |
|
|
00
|
|
|
#17 |
|
Membre du Club
![]() Inscription : avril 2004 Messages : 121 ![]() |
Bonjour,
Merci beaucoup pour ces précieux renseignements et conseils ! C'est vrai que, d'après le site, les FIBPlus ont l'air vraiment super. Je vais télécharger la version de démo pour voir ça de plus près...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com