Comment enregistrer des données d'un dataGrid dans ma base SqlServer [Résolu]

Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
- - Dernière réponse : olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
- 15 mars 2008 à 18:14
Bonjour à tous,

Voila j'aimerais que les données se trouvant dans mon DataGrid soit enregistré dans ma base SqlServer 2000.

J'ai commencé a réaliser cela :
CODE :
SqlDataAdapter MonAdapter=

new SqlDataAdapter();dataGrid2.Update();

DataTable dt=(DataTable) dataGrid2.DataSource;

MonAdapter.Update(dt);

Mais il m'affiche une erreure lorsque j'arrive à la 3éme ligne : " DataTable dt=(DataTable) dataGrid2.DataSource; "

L'erreur est la suivante : "

Informations supplémentaires*: Le cast spécifié n'est pas valide.
 "

Je vois pas comment faire pour résoudre ce problème, avez-vous une idée??

Feriez-vous de cette manière là ou d'une autre?? Si c'est d'une autre expliqué moi comment.

merci d'avance pour votre aide!!
Afficher la suite 

Votre réponse

20/44 réponses

Meilleure réponse
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
3
Merci
Si tu faisait la synthese organisée minimum et conforme a ton environnement de ce que tu fais en éliminant tout le superflu
Ca t'aiderais déja toi meme a suivre le fil minimum de comment c'est sensé marcher

1- Les declarations
2- La connection
3- Le fill
4- L'update

Entre autre ce qui me pertube dans ton code c'est qu'il semble que je vois deux instanciation de ds1

DataSet ds1 = new DataSet();

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
1
Merci
Bonjour olibara,

Ok merci pour tes renseignement.

j'ai réalisé le code suivant :
try

{
   SqlCommandBuilder cb new SqlCommandBuilder(dataAdapter);   DataSet ch

new DataSet();   ch = ds.GetChanges(DataRowState.Deleted);

   if (
null != ch)   {

      int del=dataAdapter.Update(ch);   }

     ch = ds.GetChanges(DataRowState.Modified);

   if (ch !=
null)   {

      int upd=dataAdapter.Update(ch);   }

   ch = ds.GetChanges(DataRowState.Added);

   if (ch !=
null)   {

      int add=dataAdapter.Update(ch);   }
}

   catch(Exception ex)   {

         MessageBox.Show(ex.ToString());

   }

   finally   {

         connection.Close();

   }

Mais ça n'enregistre rien dans la base.Lorsque je debugge et que je glisse ma souris sur les lignes ch ..... telle que "ch ds.GetChanges(DataRowState.Added);" Il me mette : ch = <valeur non définie>

Il rentre pas non plus dans les "if..."

Comment cela se peut-il??

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Dernière intervention
1 décembre 2009
0
Merci
Salut Loic  

Je crois que tu dois utiliser un CommandBuilder....ce lien pourrait t'aidé.
Commenter la réponse de lassaad83
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Salut lassaad83,

Merci pour ton renseignement mais ton lien correspond à un site sur java?? !! donc je vois pas comment ça peux m'aider pour faire du C#.

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Les données dans ton datagrid viennent de ou ?
Quel est le datasource de to datagrid ?
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
ben voici le code pour remplir ma DataGrid :

string
RelationClientele ("SELECT RC_DHRELCL as DateHeure, RC_CNURELCL as Contenu, RC_TELCTACT as Tel, RC_MOYCTACT as MoyenContact FROM RELATION_CLIENTELE WHERE RC_NUMINTER '" + NumInter.Text + "'");connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=DistribInfo;Integrated Security=SSPI");connection.Open();

try{
SqlDataAdapter dataAdapter new SqlDataAdapter(RelationClientele, connection);DataSet ds

new DataSet();dataAdapter.Fill(ds,"RelationClientele");

dataGrid2.DataSource = ds;

dataGrid2.DataMember = "RelationClientele";

}

catch(Exception ex){

MessageBox.Show(ex.ToString());

}

finally{

connection.Close();

}

Je pense que ce code répond a tes questions olibara?? !!

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Dernière intervention
1 décembre 2009
0
Merci
Même si c'est un site Java le lien décris éxactement ce que tu veux faire mais en Vb...
Commenter la réponse de lassaad83
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Ok lassaad83. Ok merci encor pour ce lien mais je comprend pas trop le java puis poour ce que j'en ai regadé, il me guide pas trop mais je vais continuer à l'étudier.

merci quand même pour tout!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Ok
Donc to datagridview et remplit par une requete sql et ton datasource est le dataset resultat de cette requete pour les mise ajour voici la methode magiqsue que j'ai mis un peu de tempq a trouver :

    // ************************************************************************************************************
    private void do_update()
    {



// Le plus important c'est de preparer les commandes sql , cette methode t'epargne de devoir le faire a la main ( tu dois donner ton adapter)

      MySqlCommandBuilder cb = new MySqlCommandBuilder(dataAdapter);

// Ensuite tu charge les modifs dans un ds temporaire et tu applique les differents cangemeents


      DataSet ch = new DataSet();
      ch = dsAddr.GetChanges(DataRowState.Deleted);
      if (null != ch)
      {
        int del=adaAddr.Update(ch);
        lbl_delcnt.Text = del.ToString();
      }


      ch = dsAddr.GetChanges(DataRowState.Modified);
      if (ch != null)
      {
        int upd=adaAddr.Update(ch);
        lbl_updcnt.Text = upd.ToString();
      }


      ch = dsAddr.GetChanges(DataRowState.Added);
      if (ch != null)
      {
        int add=adaAddr.Update(ch);
        lbl_addcnt.Text = add.ToString();
      }

// Dans mon cas j'ai ajouté cette comande car des deletes dans la table principale cree des orphelins dans une table liée

      MySqlCommand cmd = new MySqlCommand("DELETE from tours where addrID not in ( select addrID from address );", conn);
      int tourdel=cmd.ExecuteNonQuery();
      lbl_deltourcnt.Text = tourdel.ToString();
      dsAddr.AcceptChanges();
      
      return;
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Salut olibara,

Merci pour ton code, suis entrain d'essayer mais je me pose plusieurs questions :
    * que signifie "dsAddr" de la ligne : " ch = dsAddr.GetChanges(DataRowState.Deleted);"??
    * Que signifie "adaAddr" de la ligne : "int del=adaAddr.Update(ch);" ??
     * A quoi correspond "lbl_delcnt.Text" ainsi que "lbl_updcnt" et "lbl_addcnt" ??

     *
Puis je me demande dois-je remettre mon bout de code ou juste la création du DataAdapter??

merci d'avance pour les renseignements!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
   * que signifie "dsAddr" de la ligne : " ch = dsAddr.GetChanges(DataRowState.Deleted);"??


dsAddr est le dataset qui sert de datasource a ton DGV (chez moi il s'appelle dsAddr)

    * Que signifie "adaAddr" de la ligne : "int del=adaAddr.Update(ch);" ??
adaAddr est l'adapter qui a inititié le query select : tu dois utiliser celui la pour pouvoir generer les commande avec

MySqlCommandBuilder cb = new MySqlCommandBuilder(dataAdapter);

     * A quoi correspond "lbl_delcnt.Text" ainsi que "lbl_updcnt" et "lbl_addcnt" ??
Ca c'est juste pour afficher dans ma form les resultats (counts) des modification faites
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
"dsAddr est le dataset qui sert de datasource a ton DGV" quand tu parle de cela, tu veux dire que ça correspond à celui qui ma permit de remplir mon DataGrid??

"adaAddr est l'adapter qui a inititié le query select : tu dois utiliser celui la pour pouvoir generer les commande" tu veux dire que c'est celui là qui ma permit d'exécuter ma requête qui ma permit de remplir mon dataGrid??

Mais j'ai fais cela :
CODE :
try

{

SqlDataAdapter MonAdapter=

new SqlDataAdapter();dataGrid2.Update();

DataTable dt=(DataTable) dataGrid2.DataSource;

MonAdapter.Update(dt);

 
SqlCommandBuilder cb new SqlCommandBuilder(dataAdapter);DataSet ch

new DataSet();ch = ds.GetChanges(DataRowState.Modified);

if (ch !=
null){

int upd = dataAdapter.Update(ch);}

ch = ds.GetChanges(DataRowState.Added);

if (ch !=
null){

int add = dataAdapter.Update(ch);}

}

catch(Exception ex){

MessageBox.Show(ex.ToString());

}

finally{

connection.Close();

}

Et ça foncitonne pas, c'est à dire qu'il me dit la chose suivante :
C:\Documents and Settings\Propriétaire\Mes documents\Visual Studio Projects\SuiviClient_Distrib'Info\SuiviIntervention.cs(911): Le type ou le nom d'espace de noms 'dataAdapter' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
C:\Documents and Settings\Propriétaire\Mes documents\Visual Studio Projects\SuiviClient_Distrib'Info\SuiviIntervention.cs(917): Le type ou le nom d'espace de noms 'dataAdapter' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
C:\Documents and Settings\Propriétaire\Mes documents\Visual Studio Projects\SuiviClient_Distrib'Info\SuiviIntervention.cs(914): Le type ou le nom d'espace de noms 'ds' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)
C:\Documents and Settings\Propriétaire\Mes documents\Visual Studio Projects\SuiviClient_Distrib'Info\SuiviIntervention.cs(908): Le type ou le nom d'espace de noms 'ds' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)

RAPPEL du code de emplissage de ma DataGrid : string
RelationClientele ("SELECT RC_DHRELCL as DateHeure, RC_CNURELCL as Contenu, RC_TELCTACT as Tel, RC_MOYCTACT as MoyenContact FROM RELATION_CLIENTELE WHERE RC_NUMINTER '" + NumInter.Text + "'");
connection =

new SqlConnection("Data Source=DIST-5B8D87E3A9;Initial Catalog=DistribInfo;Integrated Security=SSPI");
connection.Open();

try{

SqlDataAdapter dataAdapter =

new SqlDataAdapter(RelationClientele, connection);
DataSet ds =

new DataSet();
dataAdapter.Fill(ds,"RelationClientele");

dataGrid2.DataSource = ds;

dataGrid2.DataMember = "RelationClientele";

}

catch(Exception ex)
{

MessageBox.Show(ex.ToString());

}

finally{

connection.Close();

}

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Excuse moi

Mais si tu faisait un effort pour rendre ton code plus liisible sur le forum ca aidrait deja beaucoup la compréhension

Le simple cup / paste que tu semble faire crer un spagetti tres difficile a suive

J'ai cependant le sentiment que tu te melange bien les pinceaux dans l'update relis bien la logique de ce que j'ai fais ! je n'ai pas l'impression que tu fais la meme chose...
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Désolé de pas mettre en plus clair le code mais je sait pas comment je peux faire pour le remodifier??

Je vois pas pourquoi tu dis ça :
"J'ai cependant le sentiment que tu te melange bien les pinceaux dans l'update relis bien la logique de ce que j'ai fais ! je n'ai pas l'impression que tu fais la meme chose..."??

Car j'ai fais la même chose que toi bon j'ai juste retiré la partie du delete car je ne veux pas supprimer le "ds".

Merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Voila je pense que le bout de code ci apres est plus lisible

- c'est qui dataAdapter ou l'a tu défini
- meme chose pour ds
- Qu'est ce que tu essaye de faire avec le code en rouge ??
TU DOIS utiliser le dataset source de to datagridview
TU DOIS utiliser l'adapter qui a executé le query du fill de ton dataset

try
{
    SqlDataAdapter MonAdapter=new SqlDataAdapter();
    dataGrid2.Update();
   
    DataTable dt=(DataTable) dataGrid2.DataSource;
   
    MonAdapter.Update(dt);
   
    SqlCommandBuilder cb = new SqlCommandBuilder(dataAdapter);
    DataSet ch = new DataSet();
    ch = ds.GetChanges(DataRowState.Modified);
    if (ch != null)
    {
      int upd = dataAdapter.Update(ch);
    }
    ch = ds.GetChanges(DataRowState.Added);
    if (ch != null)
    {
      int add = dataAdapter.Update(ch);
    }
}
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Pour le code en rouge, je sais pas trop, c'est l'ancien j'ai du oublier de le mettre en tant que com.

Le dataAdapter correspond au dataAdapter du code concernant l'insertion des données de la base dans mon DataGrid.
le ds correspond au dataSet qui ma permit de remplir mon dataGrid.

Comment faut faire pour utiliser le dataset source de to datagridview et l'adapter qui a executé le query du fill de ton dataset??

Faut savoir que je veux que le contenu de ma DataGrid s'enregistre dans ma base lorsque j'appuye sur un bouton.

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Tu les definis commun dans la classe de ta form ils seront accessible partout !

Et enleve le brico en rouge, si tu laisse déja trainer pleins de caca dans ton code c'est normal qu'on finit par ne plus savoir ou mettre les pieds !
Commenter la réponse de olibara
Messages postés
207
Date d'inscription
mardi 19 juin 2007
Dernière intervention
22 février 2016
0
Merci
Tu va me prendre pour une merde mais je vois pas ce que tu veux dire par : "Tu les definis commun dans la classe de ta form ils seront accessible partout ! "??

merci d'avance!!
Commenter la réponse de loic20h28
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Ben dis donc ....!

Tu est sur que c'est de la programmation que tu fais ??
Bon maintenant je pense que tu dois un peu chercher tout seul

namespace TestMysql
{
  public partial class MainForm : Form
  {
    // Common definition

    MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection();
    DataSet dsAddr = new DataSet();
    MySqlDataAdapter adaAddr = new MySqlDataAdapter();
    string MyConString = "server=localhost;port=3306;uid=root;database=mydb;";

    public MainForm()
    {
      InitializeComponent();
    }




 
Commenter la réponse de olibara
Messages postés
670
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
11 mars 2010
0
Merci
Excuse moi de te le rappeller mais je trouve que ton code est toujours illisible
Peux tu faire un effort s'il te plait pour ne pas etaler quelque lignes de codes sur trois pages 

La commande

 DataSet ch=new DataSet();

Devrait te rendre un dataset a voir dans le watch windows
Commenter la réponse de olibara

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.