none
le data reader ouvert ou fermé RRS feed

  • Question

  • Quand je commence une instruction FIRST ou FETCH NEXT on me demande de fermer le reader;

    mais pour passer un getInteger on me demande que le reader soit ouvert;

    quelle commande permet de faire un fetch avec un data reader ouvert?


    Jean Noël Martin


    mardi 22 avril 2014 05:44

Réponses

Toutes les réponses

  • Bonjour

    Pouvez-vous nous montrer le code?

    Si vous utilisez ExecuteReader - le plus probable vous n'avez pas besoin de utiliser le curseur. Une commande "select.. from ..." souffrira.

    Le Reader doit être ouvert, mais vous ne pouvez pas envoyer des autres commandes avant le fermer.

    Fetch First & Fetch Next   sont autres commandes SQL et normalement ils ne fonctionnent pas avec le Reader.

    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.

    mardi 22 avril 2014 08:38
    Modérateur
  • Quand on fait un select, derrière il faut récupérer les donnée on positionne le curseur avec un first et on fait déplacer le curseur avec un next

    je vous met le code:

    //
    /*------------------------------------------------------------------------------------------------*/
    /*Name          ExecuteRequestAndReadElement                                                */
    /*Role          Execute a select request                                                          */
    /*Interface                                                                                       */
    /*In            Request                                                                           */
    /*              Result        indicate if the function has returned a result                      */
    /*In/Out        None                                                                              */
    /*Result        list of semantic Elements                                                         */
    /*Constraints   None                                                                              */
    /*Resources                                                                                       */
    /*PreCondition                                                                                    */
    /*------------------------------------------------------------------------------------------------*/
    //PROC ExecuteRequestAndReadElement(In : wsRequest   Result : List)
        void CInterbaseManagerM::ExecuteSelectRequest( std::wstring wsRequest, unsigned long * dwNbResultFound)
    	{
    	//DATA
    	//
    		enum enExecuteRequestError
    		{
    		  ERROR_SELECT_REQUEST_NULL = 1,
    		  ERROR_SELECT_REQUEST_EXECUTION,
    		  ERROR_TSQLQUERY_POINTER_NULL,
    		  ERROR_DATABASE_NOT_CONNECTED,
    		  ERROR_TSQLCONNECTION_POINTER_NULL,
    		};
    		int iEndReached;
    		erc ErrorCode = INIT_NO_ERROR;
    		System::String^ sRequest;
    		sRequest = gcnew String( wsRequest.c_str());
    	//ATAD
    	//DO 
    		// IF myConnection" is not NULL) THEN
    		if( myCommand != nullptr)
    		{	
    			myCommand->CommandText = sRequest;
    			myTransaction = myConnexion->BeginTransaction();
    			myCommand->Transaction = myTransaction;
    			// quelle est la différence avec Execute?
    			*dwNbResultFound = 0;
    			myReader = myCommand->ExecuteReader();
    			// bool bFound = (m_pTSQLStatement->Fetch() == true);
    			CInterbaseManagerM::First( wsRequest);
    			iEndReached = 0;
    			while( iEndReached != -1 )
    			{
    					CInterbaseManagerM::Next( &iEndReached);
    					*dwNbResultFound += 1;
    			}
    			CInterbaseManagerM::CloseCursor();
    			//OD
    		}
    		
    	};
    
    
    	
    	void CInterbaseManagerM::CommitTransaction()
    	{
    		myTransaction->Commit();
    	}
    	
    	int CInterbaseManagerM::GetIdentifier( std::wstring wsTable_Name, std::wstring wsRowName)
    	{
    		std::wstring wsRequest;
    		int ident;
    		unsigned long dwNbResultFound;
    		wsRequest = L"SELECT " + wsRowName + L" FROM " + wsTable_Name;
    		CInterbaseManagerM::ExecuteSelectRequest(wsRequest, &dwNbResultFound);
    		if( dwNbResultFound > 0 && dwNbResultFound < 4555)
    		{
    			CInterbaseManagerM::First( wsRequest);
    			ident = GetInteger( 0);
    			CInterbaseManagerM::CloseCursor();
    		}
    		else
    			ident = 1;
    		myTransaction->Commit();
    		wsRequest = L"SET IDENTITY_INSERT  [" + wsTable_Name + L"] ON";
    		CInterbaseManagerM::ExecuteRequest(wsRequest, &dwNbResultFound);
    		myTransaction->Commit();
    		return (ident);
    	};
    	
    	void CInterbaseManagerM::ConnectDatabase()
    	{
    	}
    	
    	void CInterbaseManagerM::CloseCursor()
    	{
    			myCommand->CommandText = L"CLOSE cur";
    			myCommand->ExecuteNonQuery();
    			myCommand->CommandText = L"DEALLOCATE cur";
    			myCommand->ExecuteNonQuery();
    	}
    	
    	void CInterbaseManagerM::First( std::wstring wsRequest)
    	{
    		std::wstring wsText = L"DECLARE cur SCROLL CURSOR DYNAMIC FOR " + wsRequest;
    		System::String^ sRequest = gcnew System::String( wsText.c_str());
    		myCommand->CommandText = sRequest;
    		myCommand->ExecuteNonQuery();
    		myCommand->CommandText = L"OPEN cur";
    		myCommand->ExecuteNonQuery();
    		myCommand->CommandText = L"FETCH FIRST FROM cur";
    	};
    
    	void CInterbaseManagerM::Next( int* iEndReached)
    	{
    		myCommand->CommandText = L"FETCH NEXT FROM cur";
    		*iEndReached = myCommand->ExecuteNonQuery();
    	};
    
    	int CInterbaseManagerM::GetInteger(int Row)
    	{
    		//Row->Id = Id;
    		return( (int) myReader->GetDecimal( Row));//Row->Id);
    	};
    
    	System::String^ CInterbaseManagerM::GetString( int Row)
    	{
    		return( myReader->GetString( Row));
    	}


    Jean Noël Martin

    mardi 22 avril 2014 11:10
  • Comme déjà dis, vous n'avez pas besoin d'un curseur.
    Cet exemple est assez simple:
    http://msdn.microsoft.com/fr-fr/library/aa326246(v=vs.71).aspx

    Vous envoyez simplement "select * from la_table" comme requête SQL et le string de connexion vous l’avez déjà.

    Le While vous permet de parcourir le résultat, ligne par ligne sans envoyer une autre commande.

    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.

    • Marqué comme réponse JeanNoel53 mardi 22 avril 2014 12:35
    mardi 22 avril 2014 11:41
    Modérateur
  • une fois qu'on a parcouru une fois la requête while( CInterbaseManagerM::myReade.read()) on ne peut plus le reparcourir. Hors on sort de la méthode select par un compatge du nombre de résultats et après on veut récuperer ces resutats: comment faire?

    Jean Noël Martin

    mardi 22 avril 2014 12:46
  • Si vous voulez savoir le nobre de lignes avant les parcourir, vous devez exécuter deux commandes SQL :


    select count(*) from la_table. Il vous retourne un seul entier représentant le nombre des lignes dans la table.
    Apres vous exécutez "select * from la_table"  pour retourner les lignes complets et les parcourir.

    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.


    mardi 22 avril 2014 13:02
    Modérateur