medic63 Ответов: 1

Синтаксическая ошибка при вставке в оператор


Я получаю синтаксическую ошибку, когда пытаюсь обновить свою таблицу. Я новичок в доступе и, похоже, не могу найти проблему с большим количеством исследований и чтения книг. Доступ к 2016 году и Visual studio 2015 с использованием visual basic.

Что я уже пробовал:

Access.ExecQuery("INSERT INTO Log (LDate, LTime, HCall, " &
            "State, County, Band, Freq, Mode, MCall, HRST, MRST, " &
           "HOper, MOper, RunStart, RunEnd, NetDuration, HomeCounty, CountyLine) " &
          "VALUES(@LDate,@LTime,@HCall,@State,@County,@Band,@Freq,@Mode,@MCall,@HRST,@MRST,@Hoper,@Moper,@RunStart,@RunEnd,@NetDuration,@HomeCounty,@CountyLine);")

это код, который у меня есть, который берет параметр и помещает его в столбец. Пожалуйста помочь.

CHill60

В чем именно заключается ошибка?

Richard Deeming

Каково полное сообщение об ошибке?

medic63

синтаксическая ошибка в операторе INSERT INTO

это si все сообщение об ошибке

[no name]

Я не получаю никаких синтаксических ошибок, но я использовал Access 2013.

Michael_Davies

Имеет Доступ.ExecQuery действительно выполняет запрос? Если это так, то обычно вы строите строку параметров SQL с @<name> заполнителями для значений параметров, а затем используете метод добавления параметров для отправки значений с использованием @ <names & gt; и только после этого выполняете запрос.

Не видел этого метода, обычно использую ADO для доступа к доступу.

medic63

Вот весь код подпрограммы

Private Sub AddLogEntry()
Dim DBDA как новый OleDbDataAdapter
Dim DBTA как новый DataTable
Dim DBCon Как Новое OleDbConnection
Дим Памяти Как Новый Объект Oledbcommand
Dim bsource как новый BindingSource

'ДОБАВИТЬ ПАРАМЕТРЫ

Доступ.Addparam ("@LDate", lblDate. Text)
Доступ.Addparam ("@LTime", lblClock. Text)
Доступ.Addparam ("@HCall", txtCall. Text)
Доступ.Addparam ("@State", cbxState. Text)
Доступ.Addparam ("@County", cbxCounty.Текст)
Доступ.Addparam ("@Band", cbxBand. Text)
Доступ.Addparam ("@Freq", cbxFreq. Text)
Доступ.Addparam ("@Mode", cbxMode. Text)
Доступ.Addparam ("@Mcall", lblMCall. Text)
Доступ.Addparam("@научно-технических кадров", cbxHRst.Текст)
Доступ.Addparam ("@MRST", cbxMRst. Text)
Доступ.Addparam ("@Hoper", cbxHOper. Text)
Доступ.Addparam ("@Moper", cbxMOper. Text)
Доступ.Addparam ("@RunStart", txtRStart. Text)
Доступ.Addparam ("@RunEnd", txtREnd. Text)
Доступ.Addparam ("@NetDuration", lblNetDur. Text)
Доступ.Addparam ("@HomeCounty", lblHomeCounty.Текст)
Доступ.Addparam ("@CountyLine", cbxCountyL. Text)

'ВЫПОЛНИТЬ КОМАНДУ ВСТАВКИ
Доступ.ExecQuery ("INSERT INTO Log (LDate, LTime, HCall," &
"Штат, округ, группа, частота, режим, MCall, HRST, MRST", &
"HOper, MOper, RunStart, RunEnd, NetDuration, HomeCounty, CountyLine)" &
"VALUES(@LDate,@LTime,@HCall,@State,@County,@Band,@Freq,@Mode,@MCall,@HRST,@MRST,@Hoper,@Moper,@RunStart,@RunEnd,@NetDuration,@HomeCounty,@CountyLine);")


- Докладывать об ошибках и прерывать их
Если Не Струна.IsNullOrEmpty(Access. exception) Затем

"СООБЩЕНИЕ ОБ УСПЕХЕ
MsgBox ("строка была успешно добавлена.")

Меня.RefreshGrid()

Конец, Если

Конец Подводной Лодки

Michael_Davies

Addparam обычно приходят после того, как команде был дан SQL, вы добавляете параметры, а затем даете текст SQL с держателями параметров в нем.

Где определяется доступ и есть ли у него метод commandtext?

medic63

Майкл,

Спасибо за вопросы и предложения. Все это очень сложно понять, когда я изучаю программирование. Я смотрю много видео на U-Tube и заглядывал в книги, пытаясь понять это. Простые программы, которые я написал, похоже, работают нормально, но работа с базой данных - это совсем другое дело. У меня есть поля со списком в этой программе, и я заполняю их из таблицы, которая работает. Я могу подключиться к базе данных и просмотреть ее содержимое в работающем представлении таблицы данных. Я не понимаю нюансов, необходимых для обновления таблицы. Если вы знаете, где можно посмотреть эту информацию, я был бы признателен. Я изучал программирование самостоятельно и на U-Tube, кажется, учусь быстрее, наблюдая, а затем делая. Самая большая проблема заключается в том, что использование другой версии программ вызывает проблемы, поскольку их работа, а моя - нет.
Еще раз спасибо за ваши попытки помочь.

Я не понимаю вашего последнего вопроса.

1 Ответов

Рейтинг:
9

Michael_Davies

Попробовать это:

Private Sub AddLogEntry()
Using DBCon As New OleDbConnection(<PUT ACCESS DB CONNECTION STRING HERE>),
DBCmd As New OleDbCommand("",DBCon)

 DBCmd.CommandText = "INSERT INTO Log (LDate, LTime, HCall, " &
"State, County, Band, Freq, Mode, MCall, HRST, MRST, " &
"HOper, MOper, RunStart, RunEnd, NetDuration, HomeCounty, CountyLine) " &
"VALUES(@LDate,@LTime,@HCall,@State,@County,@Band,@Freq,@Mode,@MCall,@HRST,@MRST,@Hoper,@Moper,@RunStart,@RunEnd,@NetDuration,@HomeCounty,@CountyLine);"

 With DBCmd
 .Parameters.AddWithValue("@LDate", lblDate.Text)
 .Parameters.AddWithValue("@LTime", lblClock.Text)
 .Parameters.AddWithValue("@HCall", txtCall.Text)
 .Parameters.AddWithValue("@State", cbxState.Text)
 .Parameters.AddWithValue("@County", cbxCounty.Text)
 .Parameters.AddWithValue("@Band", cbxBand.Text)
 .Parameters.AddWithValue("@Freq", cbxFreq.Text)
 .Parameters.AddWithValue("@Mode", cbxMode.Text)
 .Parameters.AddWithValue("@Mcall", lblMCall.Text)
 .Parameters.AddWithValue("@HRST", cbxHRst.Text)
 .Parameters.AddWithValue("@MRST", cbxMRst.Text)
 .Parameters.AddWithValue("@Hoper", cbxHOper.Text)
 .Parameters.AddWithValue("@Moper", cbxMOper.Text)
 .Parameters.AddWithValue("@RunStart", txtRStart.Text)
 .Parameters.AddWithValue("@RunEnd", txtREnd.Text)
 .Parameters.AddWithValue("@NetDuration", lblNetDur.Text)
 .Parameters.AddWithValue("@HomeCounty", lblHomeCounty.Text)
 .Parameters.AddWithValue("@CountyLine", cbxCountyL.Text)
 End with

 DBCon.Open()
 if DBCmd.ExecuteNonQuery() = 1 Then
  MsgBox("Row was added SUCCESFULLY.")

  Me.RefreshGrid()
 Else
  MsgBox("Insert FAILED.")
 Endif
 DBCon.Close()
End Using

End Sub


medic63

Michael_Davies,

Это действительно устранило сообщение об ошибке, однако файл не добавлен в базу данных и не видит MsgBox. Теперь я понимаю, о чем вы спрашивали в предыдущем вопросе. Я также вижу, где мое форматирование оператора AddWithValue было неправильным.

Я ценю ваш ответ, он делает процесс более ясным.

Michael_Davies

Я добавил условие else для отображения сбоя.

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

У вас также есть то, что выглядит как ComboBoxes, вы убедились, что элемент был выбран на comboboxes?

Являются ли какие-либо поля ваших таблиц обязательными и не могут быть пустыми?

medic63

Я добавил сообщение об ошибке, которое тоже не отображается. Итак, я предполагаю, что ошибка находится в моей подпрограмме refreshGrid? есть 3 поля с часами и секундомер, чтобы отслеживать, как долго вы находитесь в эфире. Все они устанавливаются UTCNow, а поле Date также устанавливается UTCNow, за исключением секундомера, который является просто таймером счета. Когда я запускаю программу, все они выглядят в правильном формате. Поле со списком выбрано, так как состояние должно быть выбрано, чтобы показать округ в этом штате, из которого нужно выбрать, а затем выбран округ, чтобы показать, что он отображается в поле со списком. Единственное поле, которое не может быть пустым, - это поле идентификатора, для которого задано целочисленное значение и автоматически увеличивается. Это самое первое поле, установленное Access.
Надеюсь, это ответ на ваш вопрос.

Michael_Davies

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

Является ли поле даты полем даты или строкой для хранения даты?

Покажите мне дату, которую вы храните, как она появляется в lbldate. text.

medic63

Поле Date представляет собой строку, хранящую дату, а lbldate.text отображает 28.01.2017. Пройду через отладчик после того, как выясню, что я читаю в книге Visual basic 2015. Время сохраняется то же самое, что и строка типа 00:00:00.

medic63

Michael_Davies

Я прошел через отладку и ничего не нашел. Я думал и смотрел на программу и думал: "Боже, я разбросанный мозг", я никогда не упоминал, что учебник, который я использовал, добавил класс управления БД, так что, возможно, он пытается сделать одну и ту же работу дважды.
Итак, вот код класса


Публичный Класс DBControl

"СОЗДАТЬ ПЕРВОЕ СОЕДИНЕНИЕ
Общественные DBCon как новый объект oledbconnection("поставщик = Майкрософт.Туз.Oledb для.12.0;" &амп; ' частная
"Источник данных=Database11. accdb;")

'Подготовить команду базе памяти
Частная Памяти Как Объект Oledbcommand

- ДАННЫЕ БАЗЫ ДАННЫХ
Публичный DBDA как OleDbDataAdapter
Public DBTA As DataTable

'ПАРАМЕТРЫ ЗАПРОСА
Публичные Параметры Как Новый Список (OleDbParameter)

- СТАТИСТИКА ЗАПРОСОВ
Public RecordCount Как Целое Число
Публичное исключение в виде строки

Public Sub ExecQuery(запрос в виде строки)

- СБРОСИТЬ СТАТИСТИКУ ЗАПРОСОВ
RecordCount = 0
исключение = ""

Попробуй
- ОТКРЫТОЕ СОЕДИНЕНИЕ
DBCon.Открыть()

"СОЗДАТЬ КОМАНДУ БАЗЫ ДАННЫХ
DBCmd = New OleDbCommand(query, DBCon)

'ЗАГРУЗИТЬ ПАРАМЕТРЫ В КОМАНДУ DB
Параметры.По каждому элементу(подпункт(п) памяти.Параметры.Добавить(п))

"ОЧИСТИТЬ СПИСОК ПАРАМЕТРОВ
'Параметры.Четкий()

'ВЫПОЛНИТЬ КОМАНДУ И ЗАПОЛНИТЬ DATATABLE
DBTA = новый DataTable
DBDA = новый OleDbDataAdapter(DBCmd)
RecordCount = DBDA. Fill(DBTA)

Поймать ex как исключение

исключение = ex. сообщение

Конец Попытки

- ТЕСНАЯ СВЯЗЬ
Если DBCon.Состояние = ConnectionState.Откройте Тогда DBCon.Закрывать()

Конец Подводной Лодки

'ВКЛЮЧИТЬ ПАРАМЕТРЫ ЗАПРОСА И КОМАНДЫ
Public Sub Addparam(Имя Как Строка, Значение Как Объект)

Дим newParam как нового класса oledbparameter, (имя, значение)
Параметры.Добавить (newParam)

Конец Подводной Лодки


Конец Класса

это должно помочь добраться до проблемы, я надеюсь. Извините за причиненные неудобства.

Michael_Davies

Это объясняет, что такое доступ в вашем коде, вы должны объявить доступ как новый DBControl где-то.

В этом случае вы можете использовать его, поскольку он хранит параметры в массиве, а затем добавляет их в запрос перед выполнением.

Это не самый аккуратный или лучший класс доступа к БД, который я видел, суб-запрос NonQuery не возвращает значения, вы можете прочитать результаты из .Record, который будет содержать количество записей в таблице, возвращаемой строкой запроса, которая, скорее всего, является 1 строкой с 1 столбцом, который является целым числом, и он содержит либо 1 для вставленной строки, либо 0 ничего не вставлено, так что вам придется использовать это для проверки успеха или нет.

Кроме того, соединитель указывает жестко закодированную базу данных с именем Database11. accdb, которая должна находиться в вашем рабочем каталоге, предполагая, что это ваша база данных, над которой вы работаете.

medic63

он находится в рабочем каталоге. Это автономная настольная программа,которую я хочу использовать в своем хобби радиолюбителя.

Так что было бы лучше сделать общедоступными подменю в классе для add edit delete, а затем просто вызвать их из программы, или просто написать эти подменю в самой программе ? Я думаю, сначала мне нужно заставить add работать, что было бы большим шагом для меня, и программа в том виде, в каком она есть сейчас, бесполезна, если я не могу добавлять записи

Michael_Davies

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

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

Удачи вам во всем, что вы решите.

medic63

Спасибо

Я буду следить за ним!