none
récupérer un décimal et renvoyer un int RRS feed

  • Question

  • bonjour

    Je récupère des décimal paprès une requète et en suivant le lien

    J'ai codé:

            int CInterbaseManagerM::GetIdentifier( std::wstring wsTable_Name, std::wstring wsRowName)
    	{
    		std::wstring wsRequest;
    		System::Int32^ id;
    		System::Decimal^ ident;
    		unsigned long dwNbResultFound = 0;
    		wsRequest = L"SELECT " + wsRowName + L" FROM " + wsTable_Name;
    		CInterbaseManagerM::ExecuteSelectRequest(wsRequest, &dwNbResultFound);
    		while( myReader->Read())
    		{
    			ident = GetInteger( 0);
    			dwNbResultFound++;
    			id = int( ident);
    		}
    		if( dwNbResultFound == 0)
    			id = 1;
    		myReader->Close();
    		myTransaction->Commit();
    		wsRequest = L"SET IDENTITY_INSERT  [" + wsTable_Name + L"] ON";
    		CInterbaseManagerM::ExecuteRequest(wsRequest, &dwNbResultFound);
    		myTransaction->Commit();
    		return (id);
    	};

    mais la conversion explicite de id est refusé par le compilatrice. Comment y arriver?Et en outre comment ultérieurement convertir le Int32 en int?

    J'ai un peu avancé sur le sujet: j'ai codé

    	int CInterbaseManagerM::GetInteger(int Row)
    	{
    		//Row->Id = Id;
    		System::Decimal^ ident;
    		int i;
    		ident = myReader->GetDecimal( Row);
    		i = Decimal::ToSingle( *ident);
    		return( i);//Row->Id);
    	};
    

    ça passe à la compilation mais à l'exécution la ligne ident = myReader->GetDecimal( Row) est refusée pour cast ivalide (je ne vois pas ou est le Cast).


    Jean Noël Martin



    • Type modifié JeanNoel53 mardi 22 avril 2014 14:47
    • Modifié JeanNoel53 mercredi 23 avril 2014 07:21
    mardi 22 avril 2014 13:44

Réponses

Toutes les réponses

  • Bonjour

    i = Decimal::ToSingle( *ident); ne doit pas devenir :

    i = Decimal::ToSingle ident);

    En plus, si je comprends bien :

                id = int( ident); doit devenir :

                id = (int)ident;


    Bien cordialement,   


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 23 avril 2014 10:41
    Modérateur
  • Bonjour

    L'erreur se passe à la ligne d'avant.

    Je vous met d'abord le code applicatif

        CInterbaseManagerM::ExecuteSelectRequest(wssRequest.str(), &dwNbResultFound);
    //  [Get "m_SourceLanguage" and "m_TypDoC" and "M_Id with the response]
        while( CInterbaseManagerM::myReader->Read())
    	{
    			iOldDoc = iIdDoc;
    			wsSourceFile = CInterbaseManagerM::GetString( 0);
    			i = CInterbaseManagerM::GetInteger( 1);
    			iIdDoc = CInterbaseManagerM::GetInteger( 2);
    			m_SourceLanguage = (enLanguage)i;
    			dwNbResultFound++;
    	}


    je vous met le code et le message d'erreur

        int CInterbaseManagerM::GetInteger(int Row)
        {
            System::Int32^ ident;
            int i;
            ident = myReader->GetInt32( Row);
            i = Convert::ToByte( ident);
            return( i);
        };

    le message d'erreur

    Une exception non gérée du type 'System.InvalidCastException' s'est produite dans System.Data.dll
    
    Informations supplémentaires : Le cast spécifié n'est pas valide.

    est produit a l'exécution par:

    ident = myReader->GetInt32( Row);

    à noter que la méthode GetString s'exécute bien:

    	std::wstring CInterbaseManagerM::GetString( int Row)
    	{
    		System::String^ myString;
    		std::wstring wsString;
    		const wchar_t* chars;
    
    		myString = myReader->GetString( Row);
    		chars = (const wchar_t*)(Marshal::StringToHGlobalUni( myString)).ToPointer();
    		wsString.append( chars);
    		Marshal::FreeHGlobal(IntPtr((void*)chars));
    		return( wsString);
    	}

    Dans ce qui marche et ce qui ne marche pas Le GetString et le 2° GetInteger donne un bon résultat.

    Dans ce qui ne marche pas seul le premier GetInteger donne le message donnée. Je ne vois pas de cast dans le scope de l'instruction. Il semble que Microsoft ne supporte pas le GetInteger(0). en solution de contournement je met dans les requêtes une valeur quelconque en position 0 et je récupère la donnée valide en position 1. C'est une solution de contournement qui est  insatisfaisante mais qui permet d'avancer. De plus cette solution de contournement n'est pas générique.


    Jean Noël Martin








    • Modifié JeanNoel53 dimanche 27 avril 2014 16:03
    jeudi 24 avril 2014 17:23
  • La dernière version de cette primitive est la suivante:

    	int CInterbaseManagerM::GetInteger(int Row)
    	{
    		System::Int32^ ident;
    		System::Boolean^ bIsNull = false;
    		Object^ oFalse = false;
    		int i;
    		System::Int32^ iRow;
    		iRow = gcnew Int32( Row);
    		bIsNull = IDataRecord::IsDBNull( iRow);
    		if( bIsNull == oFalse)
    		{
    			ident = myReader->GetInt32( Row);
    			i = Convert::ToByte( ident);
    		}
    		return( i);
    	};
    
    Tel quel il ne passe pas la compilation;;;;


    Jean Noël Martin


    vendredi 2 mai 2014 04:37
  • La solution est donné dans ce lien

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 mercredi 7 mai 2014 15:18
    mercredi 7 mai 2014 15:18