|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
Bonjour tout le monde,
Je vous expose mon problème. Enfin tout d'abord, un petit apercu de l'infrastructure... Je suis sur une Ubuntu 5.04. Sur celle-ci, j'ai un serveur Firebird 2.0 RC5 (j'ai également fait le test avec Firebird 1.5.1 avec les mêmes résultats). J'utilise l'API native fournie avec Firebird. Maintenant la base de données (enfin pour le test, c'est vraiment ridicule mais ca permet de bien fixer le problème). Une table: TOTO qui contient un champ "nb". Une vue: VTOTO qui représente un "SELECT nb FROM TOTO". Jusque la, c'est pas trop dur. Voici le code permettant d'afficher toutes les valeurs contenues dans TOTO.nb Code :
Ca marche très bien. Le problème se produit lorsque je veux faire la meme chose mais sur la vue (on remplace donc la requete par "SELECT nb FROM VTOTO". Et la, ca marche plus du tout. Voici le résultat de l'erreur: Code :
Aidez moi SVP. Merci d'avance pour vos réponses. |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
donnes nous les définitions de la table et de la vue
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
La table: TOTO (nb INTEGER NOT NULL)
La vue: SELECT nb FROM TOTO |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
J'espère avoir bien répondu à ce que tu demandais !
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
donnes moi stp exactement le code de création de tes objets
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
CREATE TABLE TOTO (nb INTEGER NOT NULL);
CREATE VIEW VTOTO AS SELECT nb FROM TOTO; Puis pour insérer les données: INSERT INTO TOTO VALUES (5); |
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
bizzare ton histoire
tu pourrais mettre ici le source compilable ? et la version du compilateur utilisé ? c'est pour essayer de le reproduire et éventuellement le rentrer dans le gestionnaire de bug
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#8 | |||
|
Membre du Club
![]() |
Citation:
Code :
@+ |
|||
|
|
00
|
|
|
#9 | |||||
|
Membre du Club
![]() |
Citation:
Code :
Et la boucle de lecture est mal écrite (oui Barbibulle, je suis d'accord, ce n'est pas la seule bonne méthode Avertissement : Attention, le moteur de coloration syntaxique met certains mots clés (if, return) en majuscules et rend le bout de code incompilable. Code :
@+ -- Pierre Y. |
|||||
|
|
00
|
|
|
#10 | |
|
Membre du Club
![]() |
Citation:
|
|
|
|
00
|
|
|
#11 | ||
|
Membre du Club
![]() |
Ca n'a pas beaucoup de conséquences dans cet exemple, mais attention, il faut libérer la mémoire de sqlda à la fin :
Code :
|
||
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
Merci Pierre,
j'avais peur de refaire des tests de régressions pour une RC6
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
Merci beaucoup les gars.
Juste une question car ca me parait étrange. Tout d'abors, je croyais qu'il fallait +1 dans le cas où on voulait gérer le fait qu'un champ soit null ou pas (hors, d'après la structure de ma base, pas celle de l'exemple, je suis sur qu'il ne peut pas etre null, donc ca me sert à rien). Il me semble que le +1 permet d'activer le nullité en activant le bit 0 pour effectuer un masque dans les traitements après (dites si je me trompe). Encore un truc: pourquoi ca marche pour une table et pas pour une vue ??!!!! Merci encore. J'ai pas encore testé mais je suis confiant sur ce que vous me dites. |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
Autre petit point: il est bizarre ton résultat. Moi, ca marche la requete sur la table, j'obtiens bien la valeur que j'ai mis dans la table (et pas un truc de fou
Par contre, dans la ligne de linkage, je suis obliger de lier la librairie pthread sinon ca ne linke pas (-lpthread). Autre chose, le vrai problème ne se situe pas sur le type de donnée (SQL_LONG ou SQL_LONG + 1) mais sur le fait que je n'ai pas attribué de variable pour stocker le fait que le résultat est NULL ou pas. Ce qui me parait étrange, c'est que je spécifie que je ne veut pas tenir compte de la nullité de la variable (j'utilise SQL_LONG et pas SQL_LONG + 1). C'est bizarre, non?? (j'espère avoir été clair??? Encore merci pour toutes vos réponses. |
|
|
00
|
|
|
#15 | |||
|
Membre du Club
![]() |
Citation:
Peut-être qu'il ne te manque que cette ligne ? Code :
|
|||
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
A propos du résultat, en tout cas, j'ai compilé un paquet de fois et ca marche tout le temps (pour la requete sur la table).
J'ai fais un test, apparemment, on n'est pas obligé de paramétrer sqllen, ca marche très bien sans mais par contre sqlind est obligatoire (alors que dans la doc, c'est écrit que si on utilise SQL_LONG, il n'y a pas besoin de sqlind) ??? De plus, pourquoi y'a-t-il une différence de traitement entre un table et une vue??? (puisque ca marche pour la table!!). |
|
|
00
|
|
|
#17 | |
|
Membre du Club
![]() |
Citation:
Concernant l'utilisation de SQLDA, franchement, j'en sais rien, je ne sais pas si c'est obligatoire d'affecter sqlind, je ne sais pas pourquoi il faut mettre + 1 ou pas et si sqllen est obligatoire. Je sais seulement que dans les librairies qui encapsulent l'API de Fb/Ib, les mecs qui les ont écrites ont choisi d'affecter systématiquement toutes les options (avec le +1, le sqlind et le sqllen) Si on s'en tient aux exemples de l'API et à ce qu'on trouve dans ces libs et qui marche, je dirais que le mieux est de faire les choses en fonction du pire des cas non ? Peut-être qu'Henri, s'il passe par là pourra apporter des précisions ? |
|
|
|
00
|
|
|
#18 | |
|
Membre du Club
![]() |
Citation:
Et j'ai trouvé la raison :-) Il ne faut pas affecter sqlda.sqlvar[0] avant d'avoir appellé isc_dsql_prepare, si je déplace tes deux lignes de code juste avant le isql_dsql_execute, tout fonctionne, je pense que isc_dsql_prepare (ré)-initialise des trucs dans sqlvar, probablement pour indiquer le type des données qui seront renvoyées lors du isc_dsql_execute. (Faut aller fouiller dans les sources de Firebird) D'ailleurs c'est ce que j'avais fait hier soir en testant avec gcc puisque j'ai reproduit la structure des exemples de l'API... et j'ai oublié de dire que je l'avais fait. Bonne journée ;-) |
|
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : juin 2002 Messages : 8 ![]() |
Merci pour tout Pierre.
Je teste ca dès que je peux (peut etre pas aujourd'hui) et je te confirme ca. Bonne journée et bon WE |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com