Problèmes avec un DATASET en C++

Résolu/Fermé
jamsss Messages postés 36 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 septembre 2011 - Modifié par jamsss le 18/09/2011 à 18:56
jamsss Messages postés 36 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 septembre 2011 - 19 sept. 2011 à 21:38
Bonjour,

je débute en visual C++ et j'ai écrit un bout de code pour récupérer les données d'un Datset dans une variable pour pouvoir l'exploiter :

private: System::Void Btnload_Click(System::Object^  sender, System::EventArgs^  e) 
    { 
     dsArticle1->Clear(); 
     oleDbDataAdapter1->Fill(dsArticle1); 
     String^ variable; 
     variable=dsArticle1->ARTICLE->Rows[0][0]->ToString(); 
     MessageBox::Show(variable); 
    }



Ce code marche mais mon problème est que j'ai été obligé pour ça de créer une variable de type string^, moi ce que voudrais c'est mettre ces données dans un tableau de string donc un pointeur de string, j'ai essayé de faire un cast mais ça ne fonctionne pas...
Merci d'avance de votre aide ;-)

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
18 sept. 2011 à 22:55
Je pense qu'il est possible de faire des tableaux directement avec des String^

Sinon les cast c'est quand tu "convertis l'interprétation de la mémoire", là le problème c'est que les objets ^ ne sont pas situés dans la même mémoire que les objets * donc un cast ne peut pas suffire, il faut changer les données de mémoire, ce qui s'appelle du marshalling.

Tu peux regarder sur la MSDN, Comment : convertir System::String en chaîne standard
0
jamsss Messages postés 36 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 septembre 2011
Modifié par jamsss le 19/09/2011 à 21:18
Bonjour,

Tout d'abord merci de ta réponse, en effet avec cette fonction ça marche plutôt bien.

Pour ce qui est de faire les tableaux directement avec des String^ j'ai essayé avec le code suivant:

    private: System::Void Btnload_Click(System::Object^  sender, System::EventArgs^  e) 
    { 
      dsArticle1->Clear(); 
      oleDbDataAdapter1->Fill(dsArticle1); 
      String^ *tableau; 
      tableau=new String^; 
      tableau[0]=dsArticle1->ARTICLE->Rows[0][0]->ToString(); 
      MessageBox::Show(tableau[0]); 
      delete tableau; 
    }


mais je me heurte à une erreur au moment de l'allocation de la mémoire:

error C3698: 'System::String ^' : impossible d'utiliser ce type comme argument de 'nouveau'

Alors j'ai essayé la méthode du C:

 private: System::Void Btnload_Click(System::Object^  sender, System::EventArgs^  e) 
    { 
      dsArticle1->Clear(); 
      oleDbDataAdapter1->Fill(dsArticle1); 
      String^ *tableau; 
      tableau=(String^*)(malloc(sizeof(String^))); 
      tableau[1]=dsArticle1->ARTICLE->Rows[1][1]->ToString(); 
      MessageBox::Show(tableau[1]); 
      free(tableau); 
    }


La il semblerait que ça fonctionne, pas d'erreur à la compilation mais un plantage avec ceci:

HEAP CORRUPTION DETECTED: after Normal block (#125) at 0x012868F8, CRT detected that the application wrote to memory after end of heap buffer.

Une idée ?
Est ce qu'il y a une solution avec new...delete, à mon avis ce serait mieux que d'utiliser le malloc...free du c même si cela a l'air de (presque) fonctionner..

Merci d'avance ;-)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
19 sept. 2011 à 21:26
Comme je l'ai dit hier les objets ^ ne sont pas dans la même mémoire que les objets * donc ce n'est pas possible de les mélanger et de faire des ^* des malloc ou des new.
Les allocations de mémoire des objets ^ se fait avec gcnew, exemple :

array<String ^> ^ tableau = gcnew array<String ^>(10); // par exemple
0
jamsss Messages postés 36 Date d'inscription dimanche 6 septembre 2009 Statut Membre Dernière intervention 19 septembre 2011
19 sept. 2011 à 21:38
ok merci
0