Получение оператора вставки Ошибка, я не могу понять, что не так, хотя - PullRequest
0 голосов
/ 23 февраля 2010

Я пытаюсь вставить в БД, в которой есть следующие столбцы: идентификатор (autonumber), BonderIdentifier (текст), Имя пользователя (текст), Логин (дата), Выход из системы (дата).

BonderIdentifier, Имя пользователя, Логин - ПК.

Вот что я делаю:

 Public Function submitNewToDB(ByVal sessionData As BonderSession) As Boolean
    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 Session ([BonderIdentifier], [Username], [Login]) values ('{0}', '{1}', '{2}')", sessionData.bonderIdentifier _
                 , sessionData.username, sessionData.login)
        cmd = New OleDbCommand(str, cn)
        cmd.ExecuteNonQuery()
        cn.Close()

    Catch ex As Exception
        Return False

    End Try

    Return True

End Function

Как я уже сказал, я получаю вставку в ошибку, и я не знаю почему. В БД еще ничего нет и таблица создана.

EDIT Я запустил встроенную строку в Access так:

Вставить в сеанс ([BonderIdentifier], [Имя пользователя], [Логин]) значения ('Mork', 'sean', '23.02.2010, 11:12:42 AM)

И это работает .... но в VS это не так.

Ответы [ 4 ]

4 голосов
/ 23 февраля 2010

При работе с ядром базы данных Access / Jet даты ограничиваются знаком #, а не знаком '. Попробуйте изменить свое утверждение на:

str = String.Format("Insert into Session ([BonderIdentifier], [Username], [Login]) values ('{0}', '{1}', #{2}#)" _
             , sessionData.bonderIdentifier, sessionData.username, sessionData.login)
1 голос
/ 23 февраля 2010

То, что это синтаксическая ошибка, означает, что в вашем утверждении (str) что-то не так.

Каково точное значение str при возникновении ошибки? Я предполагаю, что это что-то вроде этого:

Insert into Session ([BonderIdentifier], [Username], [Login]) values ('Bill O'Brien', 'some text', 'some other text')"

Проблема ' в Bill O'Brien - это проблема в моем примере. Парсер думает, что ' закрывает текстовое значение и затем видит больше текста вместо запятой или )

Также может быть неверное форматирование данных, которое Access не воспринимает как дату. Я хотел бы увидеть строку, чтобы определить проблему.

EDIT:

Доступ требует, чтобы значения даты передавались с #, окружающим значение, а не '.

Как это:

Insert into Session ([BonderIdentifier], [Username], [Login]) values ('Bill OBrien', 'some text', #yourdatevalue#)"
0 голосов
/ 23 февраля 2010

Я переписал ваш код для использования операторов Using и Параметры .

Public Sub SubmitSessionToDB(ByVal sessionData As BonderSession)
    Using conn AS New OleDbConnection("Provider=microsoft.Jet.OLEDB.4.0;Data Source=G:\Sean\BMSBonder3_0.mdb;")
        Using cmd AS New OleDbCommand("Insert into Session ([BonderIdentifier], [Username], [Login]) values (@BonderId, @Username, @Login)", conn)
                cmd.CommandType = CommandType.Text
                cmd.Parameters.AddWithValue("@BonderId", sessionData.bonderIdentifier)
                cmd.Parameters.AddWithValue("@Username", sessionData.username)
                cmd.Parameters.AddWithValue("@Login", sessionData.login)

                conn.Open()
                cmd.ExecuteNonQuery()                
        End Using
    End Using
End Sub

Я написал это без Visual Studio, так что могут быть некоторые опечатки.

Оператор using гарантирует, что соединение всегда закрыто (даже при возникновении исключения).
Параметры предотвращают внедрение SQL, повышают удобочитаемость и облегчают обнаружение ошибок.

Если вам все еще нужно возвращаемое значение, вы можете добавить сделанный улов try.
Пожалуйста, дайте мне знать, если это также разрешит синтаксическую ошибку.

0 голосов
/ 23 февраля 2010

Я подозреваю, что проблема в том, как дата конвертируется в строку. Можете ли вы опубликовать вывод запроса (после замены), чтобы мы могли увидеть реальную проблему?

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