2017-06-17 1 views
0

Je tente d'ajouter des éléments à une base de données Access en C#. J'ai le code qui semble fonctionner (je peux ouvrir et fermer une base de données), mais l'événement de clic de bouton produit des erreurs. J'ai cherché sur Google pour toute l'après-midi, mais pas de joie. Mon code est:Ajout d'enregistrements à la base de données MS Access via C#

private void button26_Click(object sender, EventArgs e) 
{ //Setup tab LoadDatabase 
try 
{ 
connection.Open(); 
button26.ForeColor = Color.Lime; 
mainDataGridView.Visible = true; 
OleDbCommand cmd = new OleDbCommand(); 
cmd.CommandText = "INSERT INTO Main('Prop', 'Value', 'Default','Type') VALUES('one', 'Kelly', 'Jill','one')"; 
cmd.ExecuteNonQuery(); 
button26.Text = "Done Insert"; 
connection.Close(); 
} 
catch (Exception ex) 
{ 
richTextBox1.Text=("Error "+ex); 
button26.ForeColor = Color.Black; 
connection.Close(); 
} 
} 

Et l'erreur que je reçois est:

erreur System.InvalidOperationException: ExecuteNonQuery: propriété de connexion n'a pas été initialisé.
à System.Data.OleDb.OleDbCommand.ValidateConnection (méthode String)
à System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction (méthode String)
? à System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (Comportement CommandBehavior, méthode String)
à System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
à CrewCheifSettingsBeta3.Form1.button26_Click (expéditeur d'objet, EventArgs e) dans C: \ Somepath \ Form1.cs: ligne 49

Il est évident que quelque chose ne va pas avec la chaîne de connexion, et qu'elle n'est pas non plus à l'épreuve de l'injection SQL.

+1

Une commande à exécuter doit savoir quelle connexion doit être utilisée. Vous ne définissez aucune connexion à votre commande – Steve

+0

il ne compilera pas conn.Open(); OleDbCommand cmd = new OleDbCommand(); connection.CreateCommand(); cmd.CommandText = "INSERT INTO Main ('Prop', 'Value', Default ',' Type ') VALEURS (' one ',' Kelly ',' Jill ',' one ')"; cmd.ExecuteNonQuery(); button26.Text = "Terminé Insérer"; conn.Fermer(); @Steve – Data

+0

écrous aux 4 commentaires de code espace :) – Data

Répondre

0

Pour le commentaire de Steve, il n'y a pas de connexion associée à la commande lorsque vous l'instanciez comme ça. Vous devez soit définir la propriété Connection de la commande ou mieux encore utiliser connection.CreateCommand() pour créer la commande en premier lieu auquel cas elle sera déjà associée à la connexion (nettoyeur).

1

Attribuez la propriété Connection comme ci-dessous.

OleDbCommand cmd = new OleDbCommand(); 
cmd.Connection = connection; 
+0

hmm Je ne peux pas obtenir cela pour compiler @Ayax "La 'connexion' n'existe pas dans le contexte actuel" – Data

+0

S'il vous plaît partager l'erreur que vous obtenez. – SMA

+0

Il s'agit du même objet de connexion que vous avez utilisé pour l'ouvrir..connection.Open(). Comment créez-vous l'objet de connexion? – SMA

2

Le problème est bien connu. Une commande doit connaître la connexion à utiliser pour exécuter le texte de la commande. Cependant vous avez d'autres problèmes dans votre code.

Les objets de connexion (comme les commandes) ne doivent pas être globaux, mais créés lorsqu'ils sont nécessaires et détruits après. L'instruction using est très utile ici car vous n'avez pas besoin de fermer explicitement et de détruire ces objets et vous n'aurez jamais de fuites de ressources lorsqu'une exception se produit. Deuxièmement, lorsque vous utilisez des noms de champs qui sont également des mots-clés réservés dans votre base de données, vous devez inclure ces noms dans un certain type de caractères d'échappement. Ces caractères pour Access sont les parenthèses ouvertes/fermées et non les guillemets simples.

private void button26_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string cmdText = @"INSERT INTO Main 
          ([Prop], [Value], [Default],[Type])  
          VALUES('one', 'Kelly', 'Jill','one')"; 
     using(OleDbConnection connection = new OleDbConnection(.....)) 
     using(OleDbCommand cmd = new OleDbCommand(cmdText, connection)) 
     {    
      connection.Open(); 
      cmd.ExecuteNonQuery(); 
      button26.Text = "Done Insert"; 
      button26.ForeColor = Color.Lime; 
      mainDataGridView.Visible = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     richTextBox1.Text=("Error "+ex); 
     button26.ForeColor = Color.Black; 
    } 
} 

Enfin, je ne sais pas si vos champs sont de type texte. Vous passez des textes littéraux afin qu'ils soient de type texte et n'oubliez pas d'utiliser des paramètres lorsque vous passez ce code simple à vos valeurs réelles.