Используйте лучший отраслевой стандарт параметризации 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