2010-04-07 6 views
4

Mon code est ci-dessous. J'ai une méthode où je passe trois paramètres et ils sont écrits dans une table de base de données MS Access. Cependant, je reçois toujours un message d'erreur de syntaxe. Quelqu'un peut-il me dire pourquoi? J'ai eu cet exemple sur internet."Erreur de syntaxe dans l'instruction INSERT INTO". Pourquoi?

 private static void insertRecord(string day, int hour, int loadKW) 
    { 
     string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\LoadForecastDB.accdb"; 
     OleDbConnection conn = new OleDbConnection(connString); 

     string ins = @"INSERT INTO Forecasts (Day, Hour, Load) VALUES (?,?,?)"; 

     OleDbCommand cmd = new OleDbCommand(ins, conn); 

     cmd.Parameters.Add("@day", OleDbType.VarChar).Value = day; 
     cmd.Parameters.Add("@hour", OleDbType.Integer).Value = hour; 
     cmd.Parameters.Add("@load", OleDbType.Integer).Value = loadKW; 

     conn.Open(); 

     try 
     { 
      int count = cmd.ExecuteNonQuery(); 
     } 
     catch (OleDbException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 
+0

Avez-vous l'erreur de syntaxe au moment de la compilation ou de l'exécution? Pouvez-vous fournir plus d'informations sur l'erreur? –

+0

Je reçois l'erreur au moment de l'exécution. Merci! – Kevin

Répondre

7

Je pense que cela pourrait être parce que vos noms de colonnes (jour et heure) sont des mots clés aussi. Peut-être que vous pouvez mettre `(guillemets simples inversés) autour d'eux (qui fonctionne dans MySQL, ne sais pas MS Access)

+0

Hmm. Le jour et l'heure sont des mots-clés, hein? Cela peut être la racine de mon problème. Je vais changer les noms des champs dans le fichier, et changer mon 'insert' pour voir ce qu'il se passe. Merci! – Kevin

+0

Je vais avoir des doutes à ce sujet, pourrait être qu'ils ne sont pas des mots clés, mais c'était la première chose que je pouvais penser. Cela vaut la peine d'essayer de le savoir, laissez-moi savoir ce qui se passe. –

+0

Vous aviez raison! J'ai changé Day and Hour en ForecastDay et ForecastHour dans le fichier et le programme et j'ai repris le programme. Cela a fonctionné parfaitement! Bon oeil! Merci beaucoup! – Kevin

2

Essayez de changer

string ins = @"INSERT INTO Forecasts (Day, Hour, Load) VALUES (?,?,?)"; 

Pour:

string ins = @"INSERT INTO Forecasts ([Day], [Hour], [Load]) VALUES (@day, @hour, @load)"; 
+1

Je pense que les paramètres OLE DB ont besoin de '?', Pas de noms préfixés par @. – wRAR

+0

Bonne idée! Je vais le changer maintenant et voir ce qui se passe. Je vous remercie! – Kevin

+0

Oui, j'ai lu quelque part que les paramètres OLE DB requis? au lieu de "named" parms. Mais, je vais essayer n'importe quoi à ce stade. – Kevin

0

Une autre option pourrait être de se référer variables de liaison avec les numéros:

cmd.Parameters.Add(1, OleDbType.VarChar).Value = day; 
    cmd.Parameters.Add(2, OleDbType.Integer).Value = hour; 
    cmd.Parameters.Add(3, OleDbType.Integer).Value = loadKW; 

note I ne sais pas C#, mais une approche similaire fonctionne pour Java et JDBC.

+0

Merci, Juha, je verrai si ça fait une différence. – Kevin