Member 13788626 Ответов: 2

У меня возникла проблема с SQL запросом я пытаюсь сохранить файл в базе данных access но получаю ошибку времени выполнения


Ошибка времени выполнения '- 2147217900(80040e14)': синтаксическая ошибка (отсутствует оператор) в выражении запроса я получаю эту ошибку

Что я уже пробовал:

Это то, что я пробовал, и я получаю ошибку в запросе INSERT

Dim fd As FileDialog
Dim SelectFile As Variant
Dim cnn As ADODB.Connection
       Set cnn = New ADODB.Connection
       Dim rst As ADODB.Recordset
       Set rst = New ADODB.Recordset
   Set fd = Application.FileDialog(msoFileDialogOpen)
   With fd
       .AllowMultiSelect = False
       .Title = "Please select file to attach"
       If .Show = True Then
           SelectFile = .SelectedItems(1)
       Else
           Exit Sub
       End If
   End With
   Set fd = Nothing

       cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\SaveFile.accdb;Persist Security Info=False;"
       cnn.Open
       Set rst = cnn.Execute("INSERT INTO Table1 (AddFiles) VALUES (" & SelectFile & ")")
      ' rst.AddNew
       rst.Fields(1).Value = "AddFiles"

       rst.Update
       rst.Close
       cnn.Close

2 Ответов

Рейтинг:
1

Patrice T

Это SQL-инъекция: ваше имя файла продвигается в SQL-код, и SQL-сервер пытается понять имя файла как некоторый SQL-код.
Первый шаг-это изменение на:

Set rst = cnn.Execute("INSERT INTO Table1 (AddFiles) VALUES ('" & SelectFile & "')")

он будет обрабатывать имена файлов без апострофа. если имя файла может иметь Апостроф, то проблема та же самая, реальное решение вам нужно прочитать в следующих статьях.
----
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Member 13788626

Это не решило мою проблему, но показывает, что еще одна ошибка не может содержать многозначных полей

Patrice T

Каково значение SelectFile ?
Что такое тип поля ?

Member 13788626

Значение выбранного файла-это путь к файлу, который я открыл с помощью диалогового окна file.
Тип поля в базе данных Access-вложение. а тип файла в Excel - это объект

Patrice T

Каково значение переменной 'SelectFile', когда вы получаете ошибку ? Его точное содержание, а не смысл. например: 'c;\myfile.txt'

Member 13788626

Когда я получаю ошибку содержание SelectFile выглядит примерно так D:\user\Documents\db.accdb

Рейтинг:
0

Wendelius

Попробуйте использовать Метод CreateParameter (ADO) | Microsoft Docs[^] чтобы создать новый параметр для вашего оператора insert. Также использовать Метод выполнения (команда ADO) | Microsoft Docs[^] для выполнения инструкции INSERT.

Для получения более подробного примера взгляните на Пример SQL INSERT / UPDATE с использованием ADODB.Объекты Command и ADODB.Parameters - доступ к мировым форумам[^]