Проблема с соединением VBA с MySQL - подключена вверху макроса, но не внизу - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть макрос, который открывает соединение ADODB с библиотекой MySQL.Есть два запроса, которые генерируются в макросе.Первый, который работает, это оператор выбора для проверки на наличие дубликатов.Второй, который не работает, - это вставить записи в ту же таблицу, на которую ссылается оператор select.Я не получаю ошибок от VBA, и когда я копирую / вставляю непосредственно в MySQL, запрос работает нормально.

В верхней части макроса я установил соединение следующим образом:

   TimesheetConn = "DRIVER={MySQL ODBC 5.3 ANSI Driver}; SERVER=*server number*;PORT=*port number*;database=my_db;UID=User;PWD=password;Option=2"

   'Connection Info
   Dim cnn As ADODB.Connection
   On Error GoTo AdoError
       Set cnn = New ADODB.Connection
      With cnn
    .ConnectionString = TimesheetConn
    .Open
    .CommandTimeout = 0
      End With
   Set FIT_Data = New ADODB.Recordset
   Set Task_Data = New ADODB.Recordset

Затем я разрабатываю запрос Select (fitidquery) и запускаю его следующим образом:

   FIT_Data.Open fitidquery, cnn, CursorType = 2

Я не закрываю соединение, но затем перехожу к генерации следующего запроса - запроса на вставку (addtasks3) с помощью циклачерез строки и присвоение переменных.

Затем я пытаюсь снова вызвать соединение с помощью:

   Task_Data.Open addtasks3, cnn, adOpenForwardOnly, adLockReadOnly
   cnn.Close

И оно не работает и не дает никаких ошибок ни для VBA, ни для SQL.,Как было сказано выше, при копировании результата debug.print (addtasks3) в MySQL запрос выполняется правильно и вставляет записи.

Я попытался открыть второе соединение с теми же параметрами.Это не сработало.Я переместил язык On Error перед вторым вызовом запроса, и он перешел к сообщению AdoError, которое, похоже, указывает на то, что соединение там потеряно.

Я ценю любую помощь!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Итак, я должен поблагодарить всех вас, кто упомянул об ошибках.Ваши описания после перечитывания, наконец, заставили меня задуматься о том, что я сделал.Я думал, что On Error Resume Next работает только для той строки, в которой он находился в коде (я все еще очень начинаю учиться на VBA), и я не понимал, что он будет следовать остальной части кода,У меня был один до моего первого запроса, потому что, если это новая строка, он не будет ничего возвращать, чтобы проверить дубликат и вызвать ошибку.Следовательно, почему я не получаю сообщения об ошибках.

Я добавил «On Error GoTo 0» после этого раздела, и теперь я снова получаю сообщения об ошибках.Оказывается, моему пользователю отказано в использовании команды вставки для этой таблицы (даже если я смоделировал ее после таблицы, в которой он используется), так что, похоже, мне просто нужно это выяснить.Спасибо всем!

0 голосов
/ 21 февраля 2019

Если вы вводите Insert заявление, нет необходимости использовать набор записей.Вы можете просто выполнить

 cnn.Execute addtasks3

Или, если вы хотите получить количество вставленных строк, используйте ADODB.Command:

Dim cmd As New ADODB.Command
cmd.ActiveConnection = cnn
cmd.CommandText = addtasks3
Dim rowsInserted As Long
Call cmd.Execute(rowsInserted)
Debug.Print rowsInserted & " rows inserted."
...