2010-10-09 4 views
1

D'autres fois j'ai besoin de votre aide, je développe une application en C# utilisant une base de données Access (2007), le problème je pense est la requête updtate, j'ai cherché sur internet mais rien ne fonctionne, j'ai un datagridview colonnes que l'utilisateur a besoin de mettre des données sur les 2 dernières colonnes (5 lignes), je le fais déjà mais quand je remplis les colonnes dans le datagridview Il stocke les données dans l'accès à la base de données. Alors s'il vous plaît, je vous besoin d'aide ceci est mon code, aide très aprécié: Dproblème de mise à jour des données dans un datagridview via une mise à jour de la requête dans la base de données d'accès 2007?

private void btnGuardar_Click(object sender, EventArgs e) 
    { 

     //using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databsename.accdb")) 
     //{ 

     OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databasename.accdb;Persist Security Info=false"); 


     int grade = 1; 
     string x; 
     string comment; 

      for (int i = 0; i < this.dataGridView4.Rows.Count-1; i++) 
      { 

       x = dataGridView4.Rows[i].Cells[1].Value.ToString(); 
       //Console.WriteLine(x); 
       MessageBox.Show(x); 

       grade = int.Parse(x); 


       comment = dataGridView4.Rows[i].Cells[2].Value.ToString(); 
       MessageBox.Show(comment); 

       OleDbCommand cmd = new OleDbCommand("Update archievemnet set grade= @GRADE [email protected] WHERE idLine =1 ", conn); 

       cmd.Parameters.Add(new OleDbParameter("@GRADE", OleDbType.Integer)); 
       cmd.Parameters["@GRADE"].Value = grade; 

       cmd.Parameters.Add(new OleDbParameter("@comment", OleDbType.VarChar)); 
       cmd.Parameters["@COMMENT"].Value = comment; 

       cmd.Connection.Open(); 
       cmd.ExecuteNonQuery(); 
       cmd.Connection.Close(); 
      } 



     //} 



    } 

Répondre

0

Ce n'est pas la meilleure solution, mais vous pouvez essayer de fournir les valeurs directement dans la requête.

OleDbCommand cmd = new OleDbCommand("UPDATE archievemnet SET " + 
" grade = " + textBoxGrade.Text + 
" comment = " + textBoxComment.Text + 
" WHERE idLine = 1 ", conn); 

cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 
cmd.Connection.Close(); 

EDIT:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databasename.accdb;Persist Security Info=false"); 

int idLine; 
double grade; 
string comment; 

for (int i = 0; i < this.dataGridView4.Rows.Count-1; i++) 
{  
    idLine = Convert.ToInt32(dataGridView4[0, i].Value); 
    grade = Convert.ToDouble(dataGridView4[1, i].Value); 
    comment = Convert.ToString(dataGridView4[2, i].Value); 

    OleDbCommand cmd = new OleDbCommand("UPDATE archievemnet SET " + 
    " grade = " + grade + 
    " comment = '" + comment + "' WHERE idLine = "+ idLine, conn); 

    cmd.Connection.Open(); 
    cmd.ExecuteNonQuery(); 
    cmd.Connection.Close(); 
} 
+0

merci pour répondre, mais je ne sais pas comment prendre une Colum spécifique d'un datagridview, fils, je ne peux pas remplacer les valeurs – peggalvan

+0

j'ADAPT déjà mon code à votre solution, je copie votre solution et il renvoie une exception qui dit "la ligne idline est limitée à être unique, il y a une valeur prentente 3 etc" merci pour la réponse je pense que l'erreur est dans la requête sql "OleDbCommand cmd = new OleDbCommand (" Mise à jour archievemnet set grade = Commentaire @GRADE = @ COMMENT WHERE idLine = 1 ", conn);" J'écris idLine = 1 juste pour prouver que insère dans l'idline1 mais il y a 4 autres idline, je pense qu'il y a une boucle là mais j'essaye et rien – peggalvan

+0

essaye svp encore mon édition ... j'ai supposé que vous idLine est type d'int – yonan2236

0

Dans votre code, vous avez "Mise à jour archievemnet ...". C'est probablement le nom de votre table mais le mot anglais approprié est "Achievement". Vérifiez que vous épelez correctement le nom de la table. Vous devriez également avoir un bloc try/catch autour de votre code pour intercepter toutes les exceptions lancées par Access ou les connecteurs db, et certains se connectant au bloc d'exception. (J'utilise et je recommande NLog.) Vous dites que vous obtenez une exception, de quel type s'agit-il et quel est le message?

Je pense qu'il vaut mieux utiliser des paramètres dans votre code final (comme vous avez commencé à le faire), plutôt que la concaténation de chaînes comme le recommande yonan2236 - mais cela peut parfois aider au débogage. Vous pouvez essayer:

 
    String updateStmt = "UPDATE archievemnet SET " + 
     " grade = " + grade + 
     " comment = '" + comment + "' WHERE idLine = "+ idLine; 
    OleDbCommand cmd = new OleDbCommand(updateStmt, conn); 

et d'arrêter le code dans le débogueur juste avant de créer la commande. Copiez la valeur de updateStmt dans Access et voyez si vous pouvez exécuter l'instruction directement.

+0

Je déboguerai, c'est juste que c'est la première fois que je travaille en C#, l'exception est System.data.constraintexception l'idline de la colonne est limitée à être unique, il y a une valeur prentente 3 – peggalvan

+0

Cette exception vous indique que vous êtes en train de mettre à jour la table mais la table refuse vos valeurs. Je pense que le problème est dans la définition de vos données. – verisimilidude

+0

12:00 am au Mexique – peggalvan

1

Votre instruction UPDATE a besoin d'une virgule avant commentaire =

Regardez cet exemple qui fonctionne sur mon système:

UPDATE tblFoo AS f SET f.parent_id = 99, f.foo_text = "updated" 
WHERE (((f.id)=10)); 

Sans la virgule après 99 ...:

UPDATE tblFoo AS f SET f.parent_id = 99 f.foo_text = "updated" 
WHERE (((f.id)=10)); 

... Access se plaint:

Syntax error (missing operator) in query expression '99 f.foo_text = "updated"'.

Questions connexes