none
un message d'erreur qui semble sortir du context RRS feed

  • Question

  • bonjour.

    J'ai un code que je vais commenter:

      std::wstring  wsRequest;
      std::wstring wsText;
      unsigned long dwNbResultFound = 0;
      System::String^ wsTemp;
      hidDB  hidNewDocID;
      wchar_t wTempName[128];
      const wchar_t*  chars;
    //ATAD
    //DO
      hidDB ErrorCode = 0;
    //
        m_SourceLanguage = SourceLanguage;
    //  [Update the Status with "m_TypDoc"]
    //
        m_pDatabase->SetStatus(DATABASE_CONNECTED);
    //  Test the status of the T_WorkInformationTable
    //
    //  [Execute Request Insert "SourceLanguage", "StatusDoc" , document name to the table T_WORK_INFORMATION with "objInterbaseManager"]
    //  IF (an error occured) THEN
    //    [Return "ErrorCode" with the error occured]
    //  FI
        wsTemp = L"'" + wsCurrentSource + L"'";
        chars = (const wchar_t*)(Marshal::StringToHGlobalUni( wsTemp)).ToPointer();
        wsText.append( chars);
        Marshal::FreeHGlobal(IntPtr((void*)chars));
        wsRequest = L"";
        wsRequest = SELECT + WI_ID_DOC + CO + WI_DOCUMENT + FROM + WI_TABLE + WHERE + PB + WI_ID_SRC_LANG + EQ + (int)SourceLanguage  + AND + WI_DOCUMENT + EQ + wsText + PE;
        CInterbaseManagerM::ExecuteRequest( wsRequest, &dwNbResultFound);

    J'ai en entré une System::String^ wsCurrentSource

    Je la transforme pour pouvoir la mettre an base en lui mettant des cotes aux extrémités. le résultat se trouve dans wsTemp également System::String^

    puis je passe par Marshal pour la mettre en std::wstring et j'affecte le résultat dans  wsText.

    Je crée la requète avec wsText

    et le compilateur me répond

    1>..\..\..\..\DBMS\MissionDBManager\src\MissionDatabaseManager.cpp(569): error C2665: 'System::String::Concat' : aucune des 10 surcharges n'a pu convertir tous les types d'arguments
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll: peut être 'System::String ^System::String::Concat(System::Object ^,System::Object ^)'
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll: ou       'System::String ^System::String::Concat(...cli::array<Type,dimension> ^)'
    1>          with
    1>          [
    1>              Type=System::Object ^,
    1>              dimension=1
    1>          ]
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll: ou       'System::String ^System::String::Concat(System::String ^,System::String ^)'
    1>          c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\mscorlib.dll: ou       'System::String ^System::String::Concat(...cli::array<Type,dimension> ^)'
    1>          with
    1>          [
    1>              Type=System::String ^,
    1>              dimension=1
    1>          ]
    1>          lors de la tentative de mise en correspondance de la liste des arguments '(System::String ^, enLanguage)'
    je ne vois pas pourquoi il fait référence à une System::String alors que la requète prend des wchar_t* et des wstring?


    Jean Noël Martin


    mercredi 9 avril 2014 09:38

Réponses

  • Vous aviez créé une discussion et non une question comme type de file de message. ;-)

    En espérant que vous utilisez des requêtes paramétrées. ;-)


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 lundi 14 avril 2014 06:38
    samedi 12 avril 2014 22:23
    Modérateur

Toutes les réponses

  • >MissionDatabaseManager.cpp(569):

    C'est quoi cette ligne numéro 569 du fichier "MissionDatabaseManager.cpp" ?

    Pourquoi faite-vous tout ces salamalecs pour faire juste une simple requête, qui, en plus, est vulnérable à de l'SQL injection. Utilisez les requêtes paramétrées d'ADO.NET.

    En gardant de simple requêtes sous forme de chaine de caractères (.NET de préférence), vous simplifiez la maintenance en cas de changement de schéma de la base de données.


    Paul Bacelar, Ex - MVP VC++

    mercredi 9 avril 2014 12:22
    Modérateur
  • C'est la ligne de la requète.

    Jean Noël Martin

    mercredi 9 avril 2014 13:35
  • GG, 14 valeurs dont on n'a pas la définition, donc on c'est même pas quel opérateur + est appelé, mais je fais confiance au compilateur quand il dit que vous ajoutez des bananes et des oranges.

    Une chaine de caractères, c'est pas une salade de fruit.

    Sans compter un int dans tout ce foutoir, sortie d'un bon vieux cast à la C des années 80.

    Ne faites pas ce genre de "synthèse" de requête, c'est indébugable et un énorme trou de sécurité.

    Utilisez une requête paramétrée d'ADO.NET.


    Paul Bacelar, Ex - MVP VC++

    mercredi 9 avril 2014 14:27
    Modérateur
  • ci après la définition des valeurs

    #define SELECT L"SELECT " #define FROM L" FROM " #define CO L"," #define WHERE L" WHERE "

    #define AND                 L" AND " #define PB L"(" #define PE L")" #define EQ L" = " #define WI_TABLE L"T_WORK_INFORMATION" #define WI_DOCUMENT L"vcDocument" #define WI_ID_DOC L"siIdDocument" #define WI_ID_SRC_LANG L"siIdSrcLang"



    Jean Noël Martin


    • Modifié JeanNoel53 vendredi 11 avril 2014 05:31
    vendredi 11 avril 2014 05:28
  • Super, des define des années 80.

    Donc, au niveau typage des données c'est la foire au nimportnawak.

    Leur type est fonction du mode managé ou non du code où est utilisé ces MACRO.

    On arrête de se retourner la tête avec des conneries pour faire du code illisible et unsafe.

    ref class Requests abstract{
    public :
    	static const String^ DocumentsRequest = L"SELECT siIdDocument, vcDocument FROM T_WORK_INFORMATION WHERE (siIdSrcLang = @IdLang AND vcDocument = @Doc)";
    };
    ...
    ...
    	int SourceLanguage = 0;
    ...
    	String^ wsTemp = L"Toto.xlsx";
    ...
    	SqlConnection ^ conDatabase = nullptr;
        try {
            conDatabase = 
    		gcnew SqlConnection(L"Data Source=(local);Database='XXXX';Integrated Security=xxxx");
            SqlCommand ^ cmdDatabase = gcnew SqlCommand(const_cast<String^>(Requests::DocumentsRequest), conDatabase);
    		cmdDatabase->Parameters->Add(L"@IdLang", SqlDbType::Int);
            cmdDatabase->Parameters["@IdLang"]->Value = SourceLanguage;
    		cmdDatabase->Parameters->Add(L"@Doc", SqlDbType::VarChar);
            cmdDatabase->Parameters["@Doc"]->Value = wsTemp;
            DataSet ^ dsDocs = gcnew DataSet(L"DocsSet");
            SqlDataAdapter ^ sdaDocs = gcnew SqlDataAdapter();
            sdaDocs->SelectCommand = cmdDatabase;
            sdaDocs->Fill(dsDocs);
    	}
    	finally{
    		conDatabase->Close();
    	}


    Paul Bacelar, Ex - MVP VC++


    vendredi 11 avril 2014 12:14
    Modérateur
  • ok et merci. Je n'ai pas le choix résolu mais c'est comme ci.

    Jean Noël Martin


    samedi 12 avril 2014 08:11
  • ????

    Paul Bacelar, Ex - MVP VC++

    samedi 12 avril 2014 09:26
    Modérateur
  • je n'ai pas dans mes réponse de mettre le choix résolu

    Jean Noël Martin

    samedi 12 avril 2014 18:08
  • Vous aviez créé une discussion et non une question comme type de file de message. ;-)

    En espérant que vous utilisez des requêtes paramétrées. ;-)


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 lundi 14 avril 2014 06:38
    samedi 12 avril 2014 22:23
    Modérateur