Вставка в базу данных Access с AutoNumber PK и получение ошибки синтаксиса вставки - PullRequest
0 голосов
/ 18 февраля 2010

Я пытаюсь вставить в базу данных доступа, а PK является автонумерацией, генерируемой БД. Я получаю синтаксическую ошибку для оператора вставки и не знаю почему. Если возможно, я бы хотел вернуть значение autonumber в том же выражении.

Вот что я получил до сих пор.

   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

Кодирование в VB.Net очевидно. В запросе задаются все значения полей, кроме поля автонумерации.

Ответы [ 3 ]

5 голосов
/ 18 февраля 2010

Я бы поставил доллары пончикам, что проблема в том, что Дата и Пользователь - зарезервированные слова. Заключите их в квадратные скобки:

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

Еще лучше, переименуйте поля в базе данных в незарезервированные слова, чтобы предотвратить дальнейшие головные боли.

1 голос
/ 18 февраля 2010

Поместите точку останова на линию

cmd.ExecuteNonQuery()

и скопируйте значение str в окно запроса Access и выполните запрос оттуда. Окно запроса Access может точно определить проблему.

Вам нужно будет поставить хеш по обе стороны от вашей даты, если вы вставляете даты в Access. Так что значение:

Date.Now.ToString

будет:

"#" & Date.Now.ToString("yyyy-mm-dd") & "#"
0 голосов
/ 18 февраля 2010

В дополнение к комментариям жесткого кода, разделитель для дат в Access - хеш (теперь я вижу, что это упоминал hawbsl):

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

Чтобы получить номер, вам понадобится второй оператор по тому же соединению:

SELECT @@identity
...