Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/11/2007, 14h38   #1
Membre à l'essai
 
Inscription : juin 2003
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 35
Points : 21
Points : 21
Par défaut ODBC - interprétation valeur NULL

Bonjour,

J'ai une DLL qui rapatrie des données d'une base MySQL et je suis en train de l'adapter pour qu'elle se connecte à une base Oracle.
Le driver ODBC utilisé est le driver du client 10G.

Avec Mysql, quand je rapatrie une valeur à NULL, si la variable est de type entier, elle est initialisée automatiquement à 0.

Avec Oracle, elle n'est pas initialisée, sa valeur est donc aléatoire.

Code :
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
 
...
strSQL = (SQLCHAR *) "SELECT AA_COD, ROUND(PU_BASE * 100), ROUND(SUPPLEMENT * 100), DT_MODIF, nb_dents, age_min, age_max FROM R_ACTE_IVITE_PHASE ORDER BY AA_COD, DT_MODIF";
 
	retcode = SQLExecDirect (hstmt, strSQL, SQL_NTS);
	IF (retcode != SQL_SUCCESS)
		RETURN FALSE;
 
	i = 0;
	count = 0;
	retcode =SQLBindCol (hstmt, 1, SQL_CHAR, code_acte, sizeof (code_acte), &i);
	retcode =SQLBindCol (hstmt, 2, SQL_C_SLONG, &prix_base, sizeof (prix_base), &i);
	retcode =SQLBindCol (hstmt, 3, SQL_C_SLONG, &supplement, sizeof (supplement), &i);
	retcode =SQLBindCol (hstmt, 4, SQL_C_TYPE_DATE, &date_debut, sizeof (date_debut), &i);
	retcode =SQLBindCol (hstmt, 5, SQL_C_SLONG, &nb_dents, sizeof (nb_dents), &i);
	retcode =SQLBindCol (hstmt, 6, SQL_C_SLONG, &age_min, sizeof (age_min), &i);
	retcode =SQLBindCol (hstmt, 7, SQL_C_SLONG, &age_max, sizeof (age_max), &i);
 
	while ((retcode = SQLFetch (hstmt)) == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
	{
		sqldate2ingedate (&Date_tmp, &date_debut);
		while ((memcmp (code_acte, Actes[count].code_acte, 7) != 0)
		       || (Date_tmp.jour != Actes[count].modif.jour
			   || Date_tmp.mois != Actes[count].modif.mois || Date_tmp.annee != Actes[count].modif.annee))
			count++;
 
		Actes[count].pu_base = UINT32_SWAP_LE_BE (prix_base);
		Actes[count].supplement = UINT32_SWAP_LE_BE (supplement);
		Actes[count].nb_dents = (int8) nb_dents;
		Actes[count].age_min = (int8) age_min;
		Actes[count].age_max = (int8) age_max;
		count = 0;
...
	}
Le champ nb_dents est souvent à null, et du coup, avec Oracle, j'obtiens un nombre qui ne correspond à rien. Sous mysql, j'ai 0.

Il m'est difficile de modifier les requêtes et de rajouter des NVL, n'y aurait-il pas un paramètre ODBC à modifier pour initialiser par défaut.

Merci
phig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 14h41   #2
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
la conversion automatique est dangereuse (NULL et 0 n'ont pas la même signification)
il faut préférer la conversion manuelle avec NVL
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 14h46   #3
Membre à l'essai
 
Inscription : juin 2003
Messages : 35
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 35
Points : 21
Points : 21
ok, je comprends parfaitement que cela puisse être dangereux.
Mais est-elle cependant possible cette conversion automatique ?
En fait, le code n'est pas de moi, et je connais pas suffisamment les requêtes et les données pour savoir où rajouter les NVL.
J'essaye juste d'avoir un fonctionnement identique au driver Mysql en touchant au minimum au code.
phig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2007, 14h58   #4
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Le driver ODBC le permet peut-être, mais en Oracle pur, ça n'est pas possible.
Regardez-les options du drivers ODBC...
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h38.


 
 
 
 
Partenaires

Hébergement Web