Я полагаю, что -
в том, что кажется именем таблицы, является причиной проблемы, с которой вы сталкиваетесь, - но есть и другие проблемы в самом операторе SQL, и вы обязательно захотите их устранить.
Удалите ваше объявление и присвоение StrRs
.
Затем укажите локальный Const
и используйте символы [
и ]
для разделения указанных в кавычках идентификаторов - когда вашимя таблицы не является стандартным PascalCase
идентификатором (зачем вы это делаете для себя ?!), вы должны заключать его в кавычки в запросах (то есть заключать в квадратные скобки).
Обратите внимание, что пробел между )
и VALUES
:
Const sql As String = _
"INSERT INTO [Data_Backup_Modbus-001:tag001](ID,DataValue,Quality,TimeStamp,TimeStamp2) VALUES(?, ?, ?, ?, ?)"
Строка sql
будет одинаковой для каждой строки. Что будет меняться на каждой итерации, так это значения параметров (каждый параметр - это литерал ?
в тексте команды, без кавычек и конкатенаций).
For i = 2 To FinalLinha
Dim cmd As ADODB.Command '<~ DO NOT declare this "As New"
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = Cn
cmd.CommandText = sql
'the fun begins - append parameters in the same order they appear in the command string:
ID = Planilha1.Cells(i, 1)
DataValue = Planilha1.Cells(i, 2)
Quality = Planilha1.Cells(i, 3)
TimeStamp = Planilha1.Cells(i, 4)
TimeStamp2 = Planilha1.Cells(i, 5)
cmd.Parameters.Append cmd.CreateParameter(Value:=ID, Type:=adVarChar, Length:=Len(ID), Direction:=adParamInput)
cmd.Parameters.Append cmd.CreateParameter(Value:=DataValue, ...)
cmd.Parameters.Append ...
cmd.Parameters.Append ...
cmd.Parameters.Append ...
cmd.Execute '<~ note: zero need for any recordset here
Next
Когда вы используете параметризованные команды, вам никогда не нужно заботиться о одинарных кавычках;Ваш код становится намного чище, и побочным эффектом является то, что он также более безопасен (см. ссылку на Bobby Tables XKCD выше), и в качестве бонуса мистер О'Коннор ничего не сломает.
Смотретьздесь:
Dim Cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Это автоматически создаваемые объекты , и последнее, что вам нужно, это объект, который волшебным образом появляется автоматически.
Если этот код не выводит именно то, что вы ожидаете, тогда избегайте As New
:
Public Sub TestAndWeep()
Dim foo As New Collection
foo.Add 42
Debug.Print foo.Count
Set foo = Nothing
Debug.Print foo Is Nothing '<~ expecting True, are you?
End Sub