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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
 
 
#include <stdio.h>
#include <ibase.h>
#include <string.h>
#include <stdlib.h>
 
#define USER		"POLYSOUDE"
#define PASSWD		"POLYSOUDE"
#define DB_NAME		"localhost:/home/yme/tmp/test.fdb"
 
void db_print_error(ISC_STATUS *stat)
{
	if (stat != NULL)
	{
		isc_print_status(stat);
		printf("\nCode de l'erreur SQL:\n");
		isc_print_sqlerror(isc_sqlcode(stat),stat);
	}
}
 
int main(int argc, char **argv) 
{
	char param[256];
	char *ptr_param;
	int param_len;
	isc_stmt_handle stmt = 0;
	isc_tr_handle h_trans = 0;
	ISC_STATUS stat[20];
	isc_db_handle h_db = 0;
 
	ptr_param = param;
	*ptr_param++ = isc_dpb_version1;
	*ptr_param++ = isc_dpb_user_name;
	*ptr_param++ = strlen(USER);
	strncpy(ptr_param, USER, strlen(USER));		//il ne faut pas copier le 0 de fin de chaine
	ptr_param += strlen(USER);
	*ptr_param++ = isc_dpb_password;
	*ptr_param++ = strlen(PASSWD);
	strncpy(ptr_param, PASSWD, strlen(PASSWD));
	ptr_param += strlen(PASSWD);
	param_len = ptr_param - param;
 
	if (isc_attach_database(stat, 0, DB_NAME, &h_db, param_len, param))
	//   if (isc_attach_database(stat, 0, NOM_BASE, db, 0, NULL))
	{
		db_print_error(stat);
		return 1;
	}
 
	char query[] = "SELECT nb FROM TOTO";
	long nb;
	XSQLDA *sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1));
	sqlda->sqln = 1;
	sqlda->sqld = 1;
	sqlda->version = SQLDA_VERSION1;
 
	sqlda->sqlvar[0].sqldata = (char *)&nb;
	sqlda->sqlvar[0].sqltype = SQL_LONG;		//Le champ nom de la bdd ne peut pas contenir null. On ne vérifie donc pas si celui-ci est null.
 
	if (isc_start_transaction(stat, &h_trans, 1, &h_db, 0, NULL))
	{
		db_print_error(stat);
		return 1;
	}
 
	if (isc_dsql_allocate_statement(stat, &h_db, &stmt))
	{
		db_print_error(stat);
		return 1;
	}
 
	if (isc_dsql_prepare(stat, &h_trans, &stmt, 0, query, 1, sqlda))
	{
		db_print_error(stat);
		return 1;
	}
 
	if (isc_dsql_execute(stat, &h_trans, &stmt, 1, NULL))
	{
		db_print_error(stat);
		return 1;
	}
 
	int res = 0;
	do
	{
		res = isc_dsql_fetch(stat, &stmt, 1, sqlda);
 
		if (res != 100 && res != 0)		//Erreur. Lorsque res vaut 100, il n'y a plus de données à lire
			db_print_error(stat);
		else
		if (res == 0)
			printf("nb: %ld\n", nb);
 
	} while (res == 0);
 
	if (isc_dsql_free_statement(stat, &stmt, DSQL_close))		//on libère les données précédemment allouées
	{
		db_print_error(stat);
		return 1;
	}
 
	if (isc_commit_transaction(stat, &h_trans))
	{
		db_print_error(stat);
		return 1;
	}
 
	return 0;
}
Rien de bien sorcier mais c'est juste pour le test.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Dynamic SQL Error
-SQL error code = -804
-Incorrect values within SQLDA structure
 
Code de l'erreur SQL:
SQLCODE: -804
SQL ERROR:
An error was found in the application program input parameters for the SQL statement.
 
ISC STATUS:
Dynamic SQL Error
-SQL error code = -804
-Incorrect values within SQLDA structure
Sachant que le type de la donnée est exactement pareil, je vois pas pourquoi ca marche pas.

Aidez moi SVP.
Merci d'avance pour vos réponses.