IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Adaptive Server Enterprise Sybase Discussion :

Problème avec un float sous ASE 15


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 9
    Points
    9
    Par défaut Problème avec un float sous ASE 15
    Bonjour,

    J'ai un problème avec un nombre de type float sous ASE 15, est ce quelque chose de connu, cela vient il se l'ASE et y a t il un workaround ?

    Je vous explique.
    Nous (mon client et moi) sommes sous HP UX B.11.11 sur HP 9000/800/rp3440.

    J'ai upgradé ma plate forme de test de 12.5.0 en 15.0.2 EBF14329.
    Le logiciel qui utilise la base fonctionne parfaitement après l'upgrade.

    J'ai ensuite upgradé la plate forme de test de mon client de 12.5.4 à 15.0.3/EBF 16552 ESD#1.
    Et là les tests du logiciel qui exploite la base font apparaitre un comportement étrange chez mon client.

    Voici les traces :
    Chez moi en 15.0.2:
    04/11/2009 14:18:08: resourceItem->CnctQosClass=6
    04/11/2009 14:18:08: maxEBW=0.000000e+00
    04/11/2009 14:18:08: overBookingFactor=1.000000e+00
    04/11/2009 14:18:08: currentGlobalEBW=2000
    Et l'extrait de la base :
    1> select CNCT_OVBOOK_FACT from CNCT where CNCT_ID = 508989
    2> go
    CNCT_OVBOOK_FACT
    ---------------------------
    1.000000
    Et chez mon client en 15.0.3 :
    04/11/2009 15:22:36: resourceItem->CnctQosClass=6
    04/11/2009 15:22:36: maxEBW=0.000000e+00
    04/11/2009 15:22:36: overBookingFactor=0.000000e+00
    04/11/2009 15:22:36: currentGlobalEBW=0
    En conséquence le calcul de currentGlobalEBW est faux, ce qui provoque un tas de problèmes en aval, bien sûr.

    Et l'extrait de la base :
    1> select CNCT_OVBOOK_FACT from CNCT where CNCT_ID = 508989
    2> go
    CNCT_OVBOOK_FACT
    ---------------------------
    1.000000
    Donc ma question est, est ce que cette différence d'interprétation du résultat peut venir de la version d'ASE ?

    Merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Quel est le type exact de CNCT_OVBOOK_FACT ? (sp_help, p.ex.)

    Quel est le type de code client (C++, etc.)
    Comment est fait le binding entre le result set et les variables dans le client?

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Type de CNCT_OVBOOK_FACT:
    Column_name Type Length Prec Scale Nulls
    Default_name Rule_name Access_Rule_name
    Computed_Column_object Identity
    ------------------ --------------------- ------ ---- ----- -----
    --------------------- --------------------- ----------------
    ---------------------- ----------
    CNCT_OVBOOK_FACT float 8 NULL NULL 0
    NULL NULL NULL
    NULL 0
    Code client : C++

    Binding (pas sure que ce soit ça, dis moi si non) :
    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
    requete de lecture 
     
     cmd.prints(" select CNCT_SCHED_TYPE, CNCT_START_TIME, CNCT_STOP_TIME, "
    	     "        CNCT_OVBOOK_FACT "
    	     " from   CNCT "
    	     " where  CNCT_ID = %d",
    	     itsCnctId);
     
      if (itsDBMgrPtr->ACOMDBM_Select(cmd.gets())) 
      {
        if (itsDBMgrPtr->ACOMDBM_NextRow()) 
        {
          int schedType;
          tm startTime;
          tm stopTime;
     
          itsDBMgrPtr->ACOMDBM_Get(schedType);
          itsDBMgrPtr->ACOMDBM_GetDate(startTime);
          itsDBMgrPtr->ACOMDBM_GetDate(stopTime);
          itsDBMgrPtr->ACOMDBM_Get(itsOverBookingFactor);
     
          // Clear database process buffer
          itsDBMgrPtr->ACOMDBM_CancelRequest();    
     
          itsScheduleType = (Schedule_Type) schedType;
          itsStartTime = startTime;
          itsStopTime = stopTime;    
        }
    ================================================
    code de la méthode ACOMDBM_Get(itsOverBookingFactor);
     
     
    int ACOMDBM_DataBaseManager::ACOMDBM_Get(double& reel)
    {
    	char str[8196];
    	if (! ACOMDBM_Get(str)) return 0;
    	reel = atof(str);
    	return 1;
    }
     
     
     
    int ACOMDBM_DataBaseManager::ACOMDBM_Get(char* str)
    {
    	if (num_col > nbr_col) {
    		itsLogMgr->error("error ACOMDBM_Get() : no more column");
    		return 0;
    	}
     
    	DBINT data_len = dbdatlen(dbproc, num_col);
    	int data_type = dbcoltype(dbproc, num_col);
    	BYTE* data = dbdata(dbproc, num_col);
    	if (data) {
    		DBINT maxcollen = dbcollen(dbproc, num_col);
    		DBINT result = dbconvert(dbproc, data_type, data, data_len, SYBCHAR,(BYTE*) str, -1);
    		if ((result == FAIL) || (result == -1)) {
    			itsLogMgr->error("error ACOMDBM_Get(char* str) sur dbconvert()");
    			return 0;
    		}
    	}
    	else {
    		*str = 0;
    	}
    	num_col++;
     
    	return 1;
    }

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Aha... c'est du vieux code DB-Lib (ça me rappelle le début des années 90 :-)

    A priori je ne vois rien de faux dans le fetch du champs et sa conversion en "double".

    Je pense qu'il faudrait vérifier que dbdata() renvoie bien qqch (cad que le pointeur n'est pas NULL).
    Dans un debuggueur on peut aussi caster *data en double, comme ceci:

    Code c++ : 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
     
    	    int colid = dbaltcolid(dbproc, ComputeId, col);
    	    type = dbalttype(dbproc, ComputeId, col);
    	    len = dbadlen(dbproc, ComputeId, col);
    	    data = (BYTE *)dbadata(dbproc, ComputeId, col);
     
    	    switch(type)
    	    {
    	      case SYBCHAR:
    	      case SYBTEXT:
    	      case SYBIMAGE:
    		sv_setpvn(sv,( char*)data, len);
    		break;
    etc....
    	      case SYBFLT8:
    		if(dbKeepNumeric)
    		    sv_setnv(sv, *(DBFLT8*)data);
    		else
    		{
    		    sprintf(buff,"%.6f",*(DBFLT8 *)data);
    		    sv_setpv(sv, buff);
    		}
    		break;
    (code copié du module perl Sybase:Blib)

    ce qui permet de voir en "binaire" ce que Sybase a renvoyé.

    Petite note en apparté: DB-lib n'est plus maintenue/mis-à-jour depuis plusieurs années en ce qui concerne les nouvelles fonctionalités. C'est supposé toujours fonctionner, mais c'est qqch qu'il faut garder à l'esprit.
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 26
    Points : 9
    Points
    9
    Par défaut
    Merci Michael.

    On va tâcher de faire tracer ce qu'on récupère de la base avec dbdata.

    Est ce que c'est vraisemblable que notre code marche encore avec Sybase 15.0.2 et pas avec 15.0.3 ?

    Si c'est le cas j'upgraderai la prod en 15.0.2 jusqu'à ce qu'on ait résolu le problème (à moins que mon client soit d'accord pour attendre).

    Je sais bien que notre code est hors d'âge, mais il n'est pas question de le changer, juste le dépoussiérer.

    Edit : dbdata ne récupère rien

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 7
    Points
    7
    Par défaut
    Hello

    Laurielee etant en formation ... je viens donner les dernieres infos (au cas ou quelqu'un se heurterait au meme probleme).

    Il s'agit bien d'un bug dans OCS. (cf reponse Sybase ci dessous)

    DBLIB: User API dbconvert() fails to convert a floating number into a string when the value of its parameter destlen is -1 or -2.

    dbconvert() from SYBFLT8 to SYBCHAR does no longer work with destlen=-1

    With CR#582125 some code changes were made, unfortunately with the side impact causing the wrong conversion.
    This Change Request was released with SDK 15.0 ESD #15. Consequently ESDs before #15, eg. #13 and #14, have the old working code (tests with ESD#13 show that "example" runs as expected: converting float 55.555 to string yields "55.555").

    CR# 582125 fixed version Conn 15.0 ESD #21 or Conn 15.5 ESD #1

Discussions similaires

  1. Probleme avec un float sous FF
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 28/11/2005, 18h15
  2. [XHTML] problème avec les float:left
    Par glloq8 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/11/2005, 17h15
  3. problème avec les div sous Mozilla
    Par MrsFrizz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2005, 11h54
  4. problème avec z-index sous firefox ???
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/09/2005, 20h39
  5. [Sybase]Problème avec le BCP sous Solaris
    Par sl dans le forum Sybase
    Réponses: 3
    Dernier message: 09/09/2004, 07h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo