Откройте соединение, где есть пароль: Ошибка во время выполнения '-2147221241 (80040107) Ошибка автоматизации Ошибка не указана - PullRequest
1 голос
/ 08 октября 2019

У меня есть база данных, размещенная в базе данных AWS RDS-MySQL, и я пытаюсь передать данные из Excel в базу данных с помощью VBA, нажав кнопку.

Private Sub CommandButton1_Click()
  Dim con As ADODB.Connection

  Set con = New ADODB.Connection
  con.Open "Driver={MySQL ODBC 5.2.2 Driver};" & _
      "Server=worksheetautomation.***************.rds.amazonaws.com;" & _
      "Database=worksheet;" & _
      "User=****;" & _
      "Password=****;"
      "Option=3;"

  Dim rng As Range
  Set rng = Application.Range("EXP")
  Dim row As Range
  For Each row In rng.Rows
       Sql = "insert into TestExperiment(Experiment_id, Experiment_Name, Experiment_Method, Experiment_Analyst, Experiment_NumSample) values (' " & row.Cells(1).Value & " ' , ' " & row.Cells(1).Value & " ', ' " & row.Cells(2).Value & " ', ' " & row.Cells(3).Value & " ',' " & row.Cells(5).Value & ")"
       con.Execute Sql
  Next row

  con.Close     
  MsgBox "Done"

End Sub

Я пытаюсь выполнить этот коди получение ошибки времени выполнения и при попытке отладки кода:

ошибка времени выполнения '-2147221241 (80040107)

con.Open "Driver={MySQL ODBC 5.2.2 Driver};" & _
"Server=worksheetautomation.***************.rds.amazonaws.com;" & _
"Database=worksheet;" & _
"User=****;" & _
"Password=****;"
"Option=3;"

Эта часть помеченажелтым цветом со стрелкой на строке пароля.

1 Ответ

1 голос
/ 08 октября 2019

Примите во внимание следующие рекомендации в VBA:

  1. Всегда Debug\Compile код после изменения кода. Фактически, VBA должен был поднять или выделить или обозначить красным цветом проблему синтаксиса продолжения строки, как только ваш курсор покинет проблемную строку. См. Добавлено &_ ниже. Но, возможно, это опечатка в вашем посте.

    "Password=****;"  & _
    "Option=3;"
    
  2. Используйте соответствующую обработку ошибок , особенно при взаимодействии с API-интерфейсами, такими как ADO, которые могут вызывать исключения во время выполнения для более информативногосообщения:

    Private Sub CommandButton1_Click()
    On Error Goto ErrHandle
    
          '...code...
    
    ExitHandle:
       Set con = Nothing  ' RELEASE ALL set OBJECTS
       Exit Sub
    
    ErrHandle:
       Msgbox Err.Number & ": " & Err.Description
       Resume ExitHandle
    End Sub
    
  3. Используйте лучший отраслевой стандарт параметризации SQL при каждом импорте данных между прикладным уровнем (т. е. VBA) и базой данных (т. е. MySQL). Среди причин безопасности он более эффективен, удобочитаем и поддерживает, поскольку вы избегаете запутанных кавычек и конкатенации. Фактически, ваш текущий код пропускает последнюю одинарную кавычку:

    " ... ' " & row.Cells(3).Value & " ',' " & row.Cells(5).Value & ")"
    

    Большинство DB-API, таких как ADO, поддерживают параметризацию . Хотя реализация будет отличаться от VBA для других языков и от MySQL для других баз данных, основная концепция та же, что включает в себя подготовленный оператор с заполнителями параметров, которые впоследствии связываются с литеральными значениями. Рассмотрим приведенную ниже настройку:

    Dim con As ADODB.Connection, cmd As ADODB.Command
    Dim rng As Range, row As Range
    
    Set con = New ADODB.Connection
    con.Open ...
    
    ' PREPARED STATEMENT (NO DATA)
    sqlStr = "INSERT INTO TestExperiment(Experiment_id, Experiment_Name, Experiment_Method, " & _
             "                           Experiment_Analyst, Experiment_NumSample) " & _
             " VALUES (?, ?, ?, ?, ?)" 
    
    ' ITERATE THROUGH ROWS
    For Each row In Application.Range("EXP").Rows
        Set cmd = New ADODB.Command
    
        With cmd 
            .ActiveConnection = con
            .CommandType = adCmdText
            .CommandText = sqlStr
    
            ' BIND PARAMS
            .Parameters.Append .CreateParameter("id_param", adVarChar, adParamInput, 255, row.Cells(1).Value)
            .Parameters.Append .CreateParameter("name_param", adVarChar, adParamInput, 255, row.Cells(2).Value)
            .Parameters.Append .CreateParameter("method_param", adVarChar, adParamInput, 255, row.Cells(3).Value)
            .Parameters.Append .CreateParameter("analyst_param", adVarChar, adParamInput, 255, row.Cells(4).Value)
            .Parameters.Append .CreateParameter("sample_param", adVarChar, adParamInput, 255, row.Cells(5).Value)
    
            ' EXECUTE ACTION
            .Execute
        End With
    
        Set cmd = Nothing
    Next row
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...