2017-05-02 9 views
0

Ich habe Code, der in die Access-Datenbank eingefügt wird.C# In die Access-Throwing-Exception einfügen

Dieser Code funktioniert normalerweise, aber ich habe eine Tabelle, die nicht funktioniert, und ich kann nicht verstehen, warum.

Dies ist die Ausnahme, die ich erhalten:

Syntax error in INSERT INTO statement. 

Dies ist der Code:

if (connection == null) Connect(); 
command = new OleDbCommand(SQL); 
command.Connection = connection; 

try 
{ 
    connection.Open(); 
    command.ExecuteNonQuery(); 
} 
catch (Exception ex) { } 
finally { connection.Close(); } 

dies ist die SQL-Zeichenfolge:

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, dateTime, info) VALUES(1, 0, #02/05/2017 21:37:00#, '') 

dies die Tabelle TrackingsDateTimes ist:

trackingDateTimeID Number 
trackingID Number 
dateTime Date/Time 
info Text 

Was fehlt mir?

Danke,

+1

Daten Umschreiben auf einfache Anführungszeichen sein muss ... – Gusman

+0

@Gusman In Access, das ist nicht wahr. Datumsliterale in Access können mit Oktothorphen (#) umgeben sein. – ErikE

+0

Fügen Sie die Abfrage zu einem späteren Zeitpunkt in den Access-Abfrage-Designer ein und debuggen Sie von dort aus. – nicomp

Antwort

4

Nicht wirklich eine gute Idee, eine Spalte als reserviertes Schlüsselwort zu haben.

DATETIME is reserved

Wenn Sie wirklich diesen Namen verwenden wollen (Ich schlage vor, es zu ändern), dann müssen Sie eckige Klammern um diesen Namen

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, [dateTime], info) VALUES (.....) 
+0

Danke, wusste das nicht! –

-1

Sie versuchen Daten einzufügen, die statt einzelner Zitate von # umgeben sind.

mit diesem EDIT

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, dateTime, info) VALUES(1, 0, '#02/05/2017 21:37:00#', '')

ersetzen: Ich bin falsch, ist Steve richtig.

+0

Dies wird einen _Type Mismatch Fehler geben_Access akzeptiert konstante DateTime mit einem # vor und nach dem Datum im Format MM/TT/JJJJ – Steve

+0

@Steve Ich habe nicht erkannt, das war die Voraussetzung in Access, nur jemals verwendet T-SQL – RH6

+0

Konstante Datetime-Werte? Ja. Dies ist ein weiterer Grund, immer Parameter zu verwenden – Steve

0

Das erste, was ist Sie parametrisierte Abfragen statt Einfügen verwenden sollten Variablen inline. Die andere Sache ist, dass dateTime ist ein reserviertes Wort in MS Access und kann müssen mit backticks[ReservedWord].

Dies sollte Ihnen einen guten Start geben auf Ihre Anfragen

// string qry = "Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, `dateTime`, info) VALUES(@trackingDateTimeID, #trackingID, @dateTime, @info)" 
string qry = "Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, [dateTime], info) VALUES(@trackingDateTimeID, #trackingID, @dateTime, @info)" 

if (connection == null) Connect(); 
command = new OleDbCommand(SQL); 
command.Connection = connection; 
command.Parameters.AddWithValue("@trackingDateTimeID", (int)1); 
command.Parameters.AddWithValue("@trackingID", (int)0); 
command.Parameters.AddWithValue("@dateTime", DateTime.Parse("2/05/2017 21:37:00"); 
command.Parameters.AddWithValue("@info", string.Empty); 
+0

Während ich dem Parameter-Konzept zustimme (obwohl hier das Poster konstante Werte verwendet), sind die Backticks ein Syntaxfehler für den Zugriff. – Steve

+0

Aktualisiert, falsche Variante von SQL ursprünglich –