Ошибка при попытке добавить запись в таблицу access2016 из excel2016 - PullRequest
1 голос
/ 25 апреля 2019

Я использую внешний интерфейс как Excel2016, а внутренний - Access2016. Это общий файл, который будет использоваться несколькими пользователями для ввода данных.

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

Я открываю и закрываю соединение после каждого чтения / записи в моем коде, чтобы несколько пользователей могли выполнять ввод данных.

Ниже приведен мой текущий код:

strPath = ActiveWorkbook.Path
strDBName = "Test Excel Access.accdb"
strDB = strPath & "\" & strDBName

ConnDB.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0; data source=" & strDB

strTable = "Table01"

adoRecSet.Open Source:=strTable, ActiveConnection:=ConnDB, CursorType:=adOpenDynamic, LockType:=adLockOptimistic

With adoRecSet
    .AddNew
    .Fields(1) = TextBox1.Text
    .Fields(2) = TextBox2.Text
    .Fields(3) = TextBox3.Text
    .Fields(4) = TextBox4.Text
    .Fields(5) = TextBox5.Text
End With

adoRecSet.Close
Set adoRecSet = Nothing
ConnDB.Close
Set ConnDB = Nothing

Я проверил несколько форумов и вопросов в Интернете, но все они связаны с типом курсора или типом блокировки, которые я правильно использовал в соответствии с этими решениями.

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

EDIT1:

После дальнейшего анализа я думаю, что это ограничение доступа ms, и несколько пользователей не могут обновить таблицу, которую я создал напрямую. Однако это может быть возможно при использовании запросов. Я создал запрос на вставку в доступе, но я не могу его выполнить. `open_connection

cmd.ActiveConnection = ConnDB

Set fn = cmd.CreateParameter("FirstName", adVarWChar, adParamInput, 30, TextBox1.Text)
Set ln = cmd.CreateParameter("LastName", adVarChar, adParamInput, 30, TextBox2.Text)
Set age = cmd.CreateParameter("Age", adUnsignedTinyInt, adParamInput, , TextBox3.Text)
Set exp = cmd.CreateParameter("Experience", adUnsignedTinyInt, adParamInput, , TextBox4.Text)
Set tech = cmd.CreateParameter("Technology", adVarChar, adParamInput, 50, TextBox5.Text)

cmd.Parameters.Append fn
cmd.Parameters.Append ln
cmd.Parameters.Append age
cmd.Parameters.Append exp
cmd.Parameters.Append tech

strQuery = "InsertQuery"

adoRecSet.Open strQuery, ActiveConnection:=ConnDB, CursorType:=adOpenDynamic, LockType:=adLockOptimistic`

Выдает ошибку в операторе open, заявляя, что ожидает «INSERT», «UPDATE» и т. Д., Но не вызывает «InsertQuery», который я пытаюсь передать в качестве аргумента.

1 Ответ

0 голосов
/ 26 апреля 2019

Выполнение SQL-запросов из VBA легко, просто нужно сделать что-то вроде этого ...

    strSQL = "Insert into table(col1, col2, 
    col3) values (" & Cells(X,X).Value & ", " & Cells(X1,X1) 'etc
    Debug.Print strSQL
    CurrentDb.Execute strSQL

Просто обязательно очистите все переменные, которые вы добавляете перед выполнением

Редактировать: Воспроизведение этого на моем конце, у меня вообще нет проблем, поэтому я не уверен, насколько я могу помочь, даже не видя определения таблиц и т. Д. Единственное, о чем я могу думать, это если у таблицы нет первичный ключ может выдавать странные ошибки.

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