none
un insert qu'il faut faire marcher RRS feed

  • Question

  • Bonjour

    J'i un exception sur un insert qui passe bien sur l’interpréteur SQL;

    D'abord l'exception:

    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll

    puis l'application:

              hidNewWordID++;
    		  pWord->ullWordID = hidNewWordID;
              wssRequest.str(L"");
              wssRequest <<   INSERT <<
                                WORD_TABLE << BLANK <<
                                PB << WORD_STRING << CO <<
                                WORD_OCCURRENCE << CO << WORD_ID_POS << CO << WORD_ID_LANG << CO << WORD_ID_LEMMA  << PE <<
                              VALUES <<
                                PB << QM << ShapeWString(pWord->wsWord) << QM << CO <<
                                FIRST_OCCURRENCE << CO << pWord->POS << CO << 
                                Language << CO << pWord->ullLemmaID  << PE;
              try
    		  {
    			CInterbaseManagerM::ExecuteRequest(wssRequest.str(), &dwNbResultFound);
    		  }
    		  catch(...)
    		  {
    		  }
    		  CInterbaseManagerM::CommitTransaction();
    		  CInterbaseManagerM::CloseInsertion( WORD_TABLE);

    et enfin la couche de SQL:

    //
    /*------------------------------------------------------------------------------------------------*/
    /*Name          ExecuteRequest                                                                    */
    /*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::ExecuteRequest( 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,
    		};
    		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;
    			//la doc dit que ExecuteNonQuery retourne le nombre d'enregistrement dans la table, il retourne -1 si la table est vide;
    			*dwNbResultFound = (unsigned long)myCommand->ExecuteNonQuery();
    			//OD
    		}
    	};

    L"instruction qui provoque l'exception est ExecuteNonQuery.

    Je me demande si il ne faut pas un paramètre de plus dans la ligne de ConnectionString ?

    la chaine est actuellement comme suit:

    myConnexion->ConnectionString = "Integrated Security=true;Pooling=true;Max Pool Size=100;Initial Catalog=Northwind;MultipleActiveResultSets=true;Type System Version=SQL Server 2012;database=COHERENCE;server=Jonquille\\SQLEXPRESS";


    Jean Noël Martin




    mardi 10 juin 2014 20:31

Réponses

Toutes les réponses

  • Bonjour

    Dans un premier temps, faite un choix

    Initial Catalog=Northwind;

    Ou bien

    database=COHERENCE

    L'erreur renvoyée est générique. Il doit y avoir d'autres infos ailleurs.

    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 12 juin 2014 08:27
  • J'ai suivi votre conseil,mais ça n'a rien changé

    Jean Noël Martin

    jeudi 12 juin 2014 16:18
  • Avec un profiler regardez si la requête arrive sur le serveur SQL ou pas.

    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    vendredi 13 juin 2014 06:55
  • Je ne connais pas le profiler

    Quand la requête est passée par le Management Studio Ça Marche

    Pouvez vous m'en dire un peu plus


    Jean Noël Martin

    vendredi 13 juin 2014 07:26
  • Je suppose qu'il faut spécifier un time out

    Jean Noël Martin

    dimanche 15 juin 2014 14:01
  • Bonjour,

    Comme l'a dis Christophe LAPORTE, l'erreur est générique. En passant en debug au moment où l'erreur apparaît. Vous devriez avoir dans l'exception interne le message d'erreur retourné par SQL Server.

    Pouvez-vous nous le renvoyer ?


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    dimanche 15 juin 2014 14:31
  • J'ai essayé ;Timeout=60 sans changement.

    mais le temps de réaction est tel que je suppose que la requête n'est pas passée à SQL Server


    Jean Noël Martin



    dimanche 15 juin 2014 19:19
  • Mais comment l'obtenir?

    Jean Noël Martin

    dimanche 15 juin 2014 19:19
  • Bonjour,

    Dans votre méthode CInterbaseManagerM::ExecuteRequest

    Entourez l'appel à ExecuteNonQuery par un try {...}catch(SqlEception err) {... }.

    Mettez votre curseur sur l'acollade ouvrante du catch que vous venez de mettre. Apuuyez sur F9 (cela vas ajouter un point d'arrêt à cet endroit.

    Puis lancez l'application avec F5.Une fois que l'exception intervient. L'application devrait être bloqué et Visual studio sera entré en mode pas à pas.

    Lorsque vous utilisez l'espion, vous pouvez naviguer dans toutes les propriétés de l'exception. A l'interieur de celle-ci se trouve le InnerException.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 16 juin 2014 06:28
  • J'ai fiat ce que vous disiez:

    Lorsque vous utilisez l'espion, vous pouvez naviguer dans toutes les propriétés de l'exception. A l'interieur de celle-ci se trouve le InnerException

    Je n'ai pas réussi cette étape.


    Jean Noël Martin

    lundi 16 juin 2014 07:32
  • Bonjour,

    Etes-vous vous bien arrivé au point d'arrêt ?

    Avez-vous utiliser l'espion ou l'espion express ?

    Plus d'infos sur :

    http://msdn.microsoft.com/fr-fr/library/cyzbs7s2.aspx

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 16 juin 2014 07:40
  • J'ai mis un espion express sur ExecuteNonQuerry

    A partir de cet espion je n'ai pas pu avancer

    A partir du moment ou j'ai fermé l'espion je suis retombé dans le cas précédent

    Puis j'ai place l'espion sur myCommand

    et j'ai récupérée avec le status d'erreur: System::InvalidCastException

    MAIS LA REQU7TE MARCHE SOUS


    Jean Noël Martin



    lundi 16 juin 2014 16:32
  • Bonjour,

    Je penses que vous n'avez pas compris ce que je vous proposais.

    Tester le code suivant :

    try{

    *dwNbResultFound = (unsigned long)myCommand->ExecuteNonQuery();

    }catch(System::SqlException error){

    System::Diagnostics::Debug->WriteLine(error);

    }

    Mettez ensuite un point d'arrêt sur la ligne contenant le Debug->WriteLine

    Ensuite, une fois arrivé en pas à pas lors de l'exécution. Ajoutez un espion sur la variable error.

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    lundi 16 juin 2014 16:49
  • error est comme suit:

    -        error    0x03126734 { _errors=0x03126268 _clientConnectionId=0x0312678c _doNotReconnect=false }    System::Data::SqlClient::SqlException^
    +        System::Data::Common::DbException^    0x03126734    System::Data::Common::DbException^
              Class    16 ''    unsigned char
    +        ClientConnectionId    { _a=-928221091 _b=8290 ...}    System::Guid
    -         Errors    0x03126268 { errors=0x03126274 }    System::Data::SqlClient::SqlErrorCollection^
                      System::Object^    0x03126268    System::Object^
                      Count    1    int
                      Item    <impossible d'afficher la propriété indexée>    System::Data::SqlClient::SqlError^
                      System.Collections.ICollection.IsSynchronized    false    bool
            +        System.Collections.ICollection.SyncRoot    0x03126268    System::Object^
            +        errors    0x03126274 { _items=0x031261fc _size=0x031261fc _version=0x031261fc ...}    System::Collections::ArrayList^
              LineNumber    1    int
              Number    545    int
              Procedure    ""    System::String^
              Server    "Jonquille\SQLEXPRESS"    System::String^
              Source    ".Net SqlClient Data Provider"    System::String^
              State    1 ''    unsigned char
    +        _clientConnectionId    { _a=-928221091 _b=8290 ...}    System::Guid
    +        _errors    0x03126268 { errors=0x03126274 }    System::Data::SqlClient::SqlErrorCollection^


    Jean Noël Martin

    lundi 16 juin 2014 18:12
  • *dwNbResultFound = (unsigned long)myCommand->ExecuteNonQuery();
    Pourquoi faire un cast unsigned ?
    • Marqué comme réponse JeanNoel53 mardi 17 juin 2014 09:12
    lundi 16 juin 2014 18:27