2010-10-02 5 views
2

J'ai cherché, mais rien ne se passe, je commence juste à utiliser C# .NET et j'ai une zone de texte sur un formulaire. Je récupère des données de la base de données et je les affiche dans une zone de texte via une combobox qui indique la section que je veux afficher (je fais déjà ça!), Mais quand je tente de mettre à jour rien ne fonctionne, je clique sur mon bouton (Access 2007) et rien ne se passe, l'utilisateur change juste quelque chose et le bouton doit mettre à jour la base de données d'accès, je l'espère, vous pouvez me aider: D ceci est mon code à ce jour:problèmes lors de la mise à jour de la base de données Access à partir de l'aide de Textbox?

 String textTobeUpdated = textBox3.Text; 
     String thing = comboBox2.Text; 




     using (var conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDataBase.accdb")) 

     using (var cmd = conn.CreateCommand()) 
     { 


      cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing"; 
      cmd.Parameters.AddWithValue("@content",content); 


      conn.Open(); 



      int rowsAffected = cmd.ExecuteNonQuery(); 
      if (rowsAffected == 1) 
      { 
       MessageBox.Show("Success"); 
      } 
      else 
      { 
       MessageBox.Show(string.Format("{0} Rows Affected", rowsAffected)); 
      } 

cet affichage du code d'un message qui indique "exception non gérée.Si vous cliquez sur continuer, l'application omettra cette erreur et l'intention continuer.Si vous cliquez sur" Quitter ", l'application se fermera immédiatement" La valeur n'est pas spécifiée pour certains des paramètres requis.

Répondre

0

On dirait que vous exécutez deux fois la requête (deux zones où vous appelez cmd.ExecuteNonQuery();)

Retirez le premier et de laisser la ligne qui dit

int rowsAffected = cmd.ExecuteNonQuery(); 

Cette ligne effectuera la mise à jour, comptez alors comment de nombreuses lignes ont été mises à jour. Ce compte est ensuite utilisé pour afficher un message à l'utilisateur.

Vous ne définissez pas la variable content avec une valeur, (je suppose que cela devrait être la valeur de la zone de texte), et la requête de mise à jour elle-même semble un peu étrange, vous n'avez pas paramétré la 'chose' mise à jour, donc je suppose qu'il devrait être:

cmd.CommandText = "UPDATE Section SET content=[@content] WHERE name=[@thing]"; 
cmd.Parameters.AddWithValue("@content", textTobeUpdated); 
cmd.Parameters.AddWithValue("@thing", thing); 
+0

Il suffit d'afficher un message qui me dire une exception non gérée par l'application – peggalvan

+0

@Natalie. Si vous mettez à jour votre question originale avec le texte d'exception, cela pourrait vous aider. – Slartibartfast

+0

J'ai édité, il semble que quelque chose ne va pas dans la requête je suppose – peggalvan

0

Si vous êtes nouveau à .NET et en utilisant une version récente de C#, alors je vous recommande que vous écrivez votre code d'accès aux données en utilisant LINQ.

Vous devez apprendre LINQ, mais c'est beaucoup plus naturel que d'apprendre ADO.NET.

Vous utiliseriez ensuite des classes Repository pour écrire l'accès aux données pour votre application et vous obtiendrez une base de code beaucoup plus facile à maintenir.

Je pense que la solution de Slartibartfast est correcte, étant donné le code, mais je l'affiche comme une réponse et non comme un commentaire car l'utilisation de LINQ est la courbe d'apprentissage la plus facile. Vous pouvez ensuite apprendre ADO.NET si vous en avez besoin.

EDIT:

Je pense que les bits de C#, vous devez lire sur sont LINQ, LINQ to SQL, LINQ to Entities, ainsi que le motif du référentiel pour l'encapsulation du code d'accès aux données. Votre code ci-dessus est écrit en utilisant ADO.NET, qui est le moyen dur et bas niveau de le faire. Sauf si vous avez des tonnes de code hérité, alors LINQ est la voie à suivre, je pense.

a. LINQ:

LINQ est l'abréviation de langue intégrée et vous permet d'interroger une collection d'objets comme vous le feriez pour une base de données. Mais c'est aussi, dans ses arômes LINQ to SQL et LINQ to Entities, une technologie d'accès aux données. Il vous permet d'interroger, créer, modifier et supprimer des données dans une base de données (ou autre banque de données). Il "ressemble" à SQL, mais est fortement typé.

b. Repository Pattern:

Le Repository Pattern est un motif qui vous permet de normaliser (et de tester si vous le souhaitez) votre code d'accès aux données, le tout encapsulé dans une classe.Cela rend votre code beaucoup plus facile à maintenir.

Internet est inondé de discussions, de blogs et d'exemples d'utilisation de LINQ.

EDIT FOURNIRA LINQ EXEMPLE DE SQL OPTION:

Les os nus de ce que vous voulez faire serait, à peu près:

En supposant que vous avez créé le fichier DBML appelé dbDataContext, et que le dossier vous vouloir mettre à jour est dans une table appelée MyTable:

// instantiate the datacontext object using the connection string 
var db = new dbDataContext("myConnectionString"); 

// retrieve the record to update 
var record = (from r in db.Section where r.Name == "thing" select r).Single(); 

if (record != null) record.Content = "Content"; 

try 
{ 
// try to update the database 
db.SubmitChanges(); 
MessageBox.Show("Success!"); 
} 
catch 
{ 
// Darn! Didn't work... 
MessageBox.Show("Ooops!"); 
} 

Notez que c'est lisible.

+0

merci, je pense que j'ai besoin de mieux comprendre tous les concepts, Je connais un peu Java – peggalvan

+0

Je pense que c'est plus lisible, j'ai besoin d'apprendre Linq, et d'utiliser dans un projet merci de répondre – peggalvan

+0

http://stackoverflow.com/questions/295772/query-microsoft-access-mdb-database -using-linq-and-c – awrigley

0

Change: cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";

Pour: cmd.CommandText = "UPDATE Section SET content = ? WHERE name= thing";

Grâce OleDB Je ne pense pas que vous pouvez nommer le paramètre dans le texte de commande pour Jet/ACE. Si vous avez plus d'un paramètre, vous devrez les garder en ordre et continuer à utiliser '?'.

...Where [This] = ? AND [That] = ?; 

Ajoutez les paramètres dans le bon ordre.

+0

merci pour asnwering mais j'ajoute les paramètres dans l'ordre correct mais rien ne se passe quand je vérifie la base de données d'accès, theres aucun changement – peggalvan

+0

Avez-vous utilisé un point d'interrogation au lieu du nom du paramètre dans le commandtext? – JeffO

Questions connexes