ошибка sql — отсутствует (;) в конце инструкции sql

#sql

#sql

Вопрос:

Я пытаюсь заставить этот бит работать, но он продолжает говорить, что отсутствует (;) в конце инструкции SQL. В принципе, этот код получит имя файла изображения и вставит photodatabase в fileName столбец in, если имя файла уже существует, тогда просто update = 1 .

 INSERT INTO photoDB(fileNames) 
VALUES('"   Path.GetFileName(fileName)   "')
ON DUPLICATE KEY UPDATE fileNames = 1
 

Комментарии:

1. Первая проблема: вы открыты для атак с использованием SQL-инъекций. Вашим следующим шагом должно быть использование параметризованного SQL. Затем покажите нам остальную часть (исправленного) кода.

2. Прочитайте ошибку. Это точно описывает причину сбоя кода.

3. К вашему сведению: при работе с SQL более полезно показывать фактический запрос, вызывающий ошибку, чем показывать, КАК вы генерируете запрос. иногда это может быть полезно, но если проблема заключается в синтаксической ошибке, нам нужно посмотреть, ЧТО вызывает синтаксическую ошибку, а не то, как вы ее создали.

4. Кто поддерживает это?? Это синтаксическая ошибка, и сообщение об ошибке дает ответ.

5. Пожалуйста, укажите диалект SQL, который вы используете, и как именно выглядит строка dbinsert после ее создания (то есть, что возвращает содержимое Path.GetFileName ).

Ответ №1:

Сообщение об ошибке совершенно ясно. Вам нужна точка с запятой в конце вашей строки SQL ( fileNames = 1; .

Комментарии:

1. @Martin: в случае, если вы этого не видите, точка с запятой в конце вашей строки кода не является частью вашей фактической инструкции SQL, поскольку она находится за пределами кавычек. Конец вашей строки должен выглядеть следующим образом: fileNames = 1;"; . Это одна из многих причин, по которой создание инструкций SQL с помощью конкатенации строк является плохой идеей — это делает их отладку утомительной.

2. Имена файлов = 1″; или имена файлов = 1″;»»; или имена файлов = 1;»; ни один из них не работает.

3. Итак, предположительно, это избавит вас от ошибки с запятой и выдаст вам новое сообщение об ошибке.

Ответ №2:

Вот пример, который помогает защитить от внедрения SQL и устраняет вашу проблему с точкой с запятой.

 SqlConnection conn = new SqlConnection("ConnectionString");

SqlCommand command = new SqlCommand();
command.Connection = conn;
command.CommandText = "INSERT INTO photoDB (fileNames) VALUES(@fileName) ON DUPLICATE KEY UPDATE fileNames = 1;";
command.Parameters.Add(new SqlParameter("@filename", System.Data.SqlDbType.VarChar).Value = Path.GetFileName(fileName));
command.ExecuteNonQuery();
 

Ответ №3:

Второй ответ (теперь, когда OP исправил проблему с точкой с запятой).

  1. Это MySQL? Другие базы данных не будут поддерживать синтаксис С ПОВТОРЯЮЩИМСЯ КЛЮЧОМ.
  2. Ваше предложение ON DUPLICATE KEY устанавливает ТЕКСТОВЫЙ столбец (имена файлов) в ЦЕЛОЧИСЛЕННОЕ значение (1). Попробуйте заключить целое значение в кавычки.