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