2010-02-18 7 views
0

J'essaie d'insérer dans un accès db et le PK est un numéro automatique généré par la base de données. Je reçois une erreur de syntaxe pour l'instruction d'insertion et je ne sais pas pourquoi. Si possible, je voudrais retourner la valeur autonumber dans la même déclaration.Insertion dans une base de données Access avec un PK AutoNumber et obtention d'une erreur de syntaxe d'insertion

Voici ce que j'ai obtenu jusqu'ici.

Dim cn As OleDbConnection 
    Dim cmd As OleDbCommand 
    Dim str As String 

    Try 
     cn = New OleDbConnection("Provider=microsoft.Jet.OLEDB.4.0;Data Source=G:\Sean\BMSBonder3_0.mdb;") 
     cn.Open() 
     str = String.Format("Insert into Bonder(BonderName, BonderConfig, Date, User) values ('{0}', '{1}', '{2}', '{3}')", addBonder.BonderName _ 
        , xmlString, Date.Now.ToString, Environment.UserName) 
     MsgBox(str) 
     cmd = New OleDbCommand(str, cn) 
     cmd.ExecuteNonQuery() 
     cn.Close() 

    Catch ex As Exception 
     MsgBox(ex.Message) 
     Return False 
    End Try 

    Return Nothing 

Codage dans VB.Net évidemment. Dans la requête, toutes les valeurs de champ sont définies à l'exception du champ autonumber.

Répondre

5

Je parierais des dollars aux beignets que le problème est parce que la date et l'utilisateur sont des mots réservés. Les enfermer entre crochets:

str = String.Format("Insert into Bonder(BonderName, BonderConfig, [Date], [User]) .... 

Mieux encore, renommer les champs de la base de données à des mots non réservés à prévenir d'autres maux de tête.

1

Mettez un point d'arrêt sur la ligne

cmd.ExecuteNonQuery() 

et copie la valeur de str vers la fenêtre de requête d'accès et exécuter la requête à partir de là. La fenêtre de requête Access peut identifier le problème.

Vous devrez placer un hachage de chaque côté de votre date si vous insérez des dates dans Access. Ainsi, la valeur:

Date.Now.ToString 

sera:

"#" & Date.Now.ToString("yyyy-mm-dd") & "#" 
0

En plus des commentaires de hardcode, le délimiteur pour les dates dans Access est hachage (je vois maintenant que cela a été mentionné par hawbsl):

"Insert into Bonder(BonderName, BonderConfig, Date, User) values ('{0}', '{1}', #{2}#, '{3}') 

Pour obtenir le numéro, vous avez besoin d'une deuxième déclaration sur la même connexion:

SELECT @@identity