Неверный синтаксис рядом с "-" - PullRequest
0 голосов
/ 08 октября 2019

Мои друзья,

Я запускаю код через VBA для вставки значений в таблицу в SQL Server. Тем не менее возникает следующая ошибка: «Неправильный синтаксис рядом» - «. После всех шагов, нажав F8, ошибка возникает в« Rs.Open StrRs, Cn ». Помогите найти ошибку?

Sub InsertSQL()    

Dim Cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim StrCn, StrRs As String
Dim FinalLinha As Long

FinalLinha = Planilha1.UsedRange.Rows.Count

StrCn = "Provider=SQLOLEDB.1; Initial Catalog=AdvantechDB; Data Source=WIN-I2US3L4IBGJ\HISTSQLSERVER;User Id=sa;Password=libra*123"

Cn.Open StrCn

For i = 2 To FinalLinha

    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)

StrRs = "INSERT INTO Data_Backup_Modbus-001:tag001(ID,DataValue,Quality,TimeStamp,TimeStamp2)" & _
        "VALUES('" & ID & "'" & "," & "'" & DataValue & "'" & "," & "'" & Quality & "','" & TimeStamp & "','" & TimeStamp2 & "')"

        Rs.Open StrRs, Cn

        Next i

 Rs.Close
 Cn.Close

End Sub

Ответы [ 2 ]

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

Я полагаю, что - в том, что кажется именем таблицы, является причиной проблемы, с которой вы сталкиваетесь, - но есть и другие проблемы в самом операторе 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
0 голосов
/ 09 октября 2019

Друзья мои,

Проблема решена. Имя таблицы стало причиной ошибки «Неправильный синтаксис рядом» - «. В операторах SQL были и другие ошибки, о которых упоминал @Mathieu Guindon. Я бесконечно благодарю вас за помощь.

Ниже приведенокод результата (игнорируйте значения как случайные):

Sub InsertSQL()

Dim Cn As New ADODB.Connection
Dim Rs As New ADODB.Recordset
Dim StrCn As String
Dim cmd As ADODB.Command
Dim DateTime As Date

StrCn = "Provider=SQLOLEDB.1; Initial Catalog=AdvantechDB; Data Source=WIN-I2US3L4IBGJ\HISTSQLSERVER;User Id=sa;Password=libra*123"

Cn.Open StrCn

    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = Cn

    cmd.Parameters.Append cmd.CreateParameter(DataValue, adInteger, adParamInput, Len(DataValue))
    cmd.Parameters.Append cmd.CreateParameter(Quality, adInteger, adParamInput, Len(Quality))
    cmd.Parameters.Append cmd.CreateParameter(TimeStamp, adDBTimeStamp, adParamInput, Len(TimeStamp))
    cmd.Parameters.Append cmd.CreateParameter(TimeStamp2, adDBTimeStamp, adParamInput, Len(TimeStamp2))
    cmd.Parameters.Append cmd.CreateParameter(DateTime, adDBDate, adParamInput, Len(DateTime))

Const sql As String = _
    "INSERT INTO [ufvanta5](DataValue,Quality,TimeStamp,TimeStamp2,DateTime) VALUES(1,32772,1567998000,599147,'2019-10-09 17:30:00')"

Rs.Open sql, Cn

Cn.Close

End Sub
...