Задавайте вопросы, мы ответим
Вы не зашли.
Доброго вечера суток, уважаемые форумчане.
Пишу тут себе программку на дельфях, понадобилось хранить данные в бд, выбрал mysql.
При попытке отправить запрос через программу - выходит ошибка 1064, через phpmyadmin все отрабатывает без проблем. Запрос прилагаю:
Отредактированно Zakuskin (11.07.2018 16:09:01)
Неактивен
C некоторой вероятностью поможет замена двойных кавычек на одинарные в запросе.
А какой текст ошибки прилагается к 1064?
Посмотрите еще
https://sqlinfo.ru/articles/info/15.html
здесь основные случаи разобраны.
Неактивен
deadka написал:
C некоторой вероятностью поможет замена двойных кавычек на одинарные в запросе.
А какой текст ошибки прилагается к 1064?
Посмотрите еще
https://sqlinfo.ru/articles/info/15.html
здесь основные случаи разобраны.
При одинарных кавычках компилятор не отрабатывает запрос, не может отличить содержимое переменной string от запроса.
Полный текст ошибки:
[MySQL][OBDC 5.1 Driver][mysqld-5.5.25]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO `spis`VALUES (102, "wqewgfdgd", "2018-07-11","2018-07-11",500,500,5' at line 2.
Неактивен
Так экранируйте кавычки в запросе
INSERT INTO `spis` VALUES (102, \'wqewgfdgd\', \'2018-07-11\',\'2018-07-11\',500,500,500,\'Да\',500,500);
Неактивен
Экранировал, не помогло
Неактивен
Покажите код, которым вставляете?
И перед непосредственной вставкой в базу сделайте вывод планируемого запроса в файл какой-нибудь и приложите файл сюда к сообшение.
Неактивен
И покажите результат запроса
Неактивен
procedure TForm1.Button6Click(Sender: TObject);
var q:string;
begin
q:'INSERT INTO `spis` VALUES (102, ''wqewgfdgd'', ''2018-07-11'',''2018-07-11'',500,500,500,''Да'',500,500);');
ADOQuery1.SQL.Add(q);
memo1.Lines.Clear;
memo1.Lines.Add(q);//вывод запроса в мемо
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
ADOQuery1.Active:=true;
end;
Запрос выводится такой:
INSERT INTO `spis` VALUES (102, 'wqewgfdgd', '2018-07-11','2018-07-11',500,500,500,'Да',500,500);
show create table `spis`:
CREATE TABLE `spis` ( `Numpp` smallint(6) NOT NULL AUTO_INCREMENT, `fio` varchar(100) CHARACTER SET cp1251 NOT NULL, `dataz` varchar(100) NOT NULL, `datav` varchar(100) NOT NULL, `cenap` varchar(6) NOT NULL, `room` varchar(4) NOT NULL, `sump` varchar(6) NOT NULL, `stop` enum('Да','Нет') CHARACTER SET cp1251 NOT NULL, `cenas` varchar(6) NOT NULL, `sumall` varchar(6) NOT NULL, PRIMARY KEY (`Numpp`), UNIQUE KEY `Номер` (`Numpp`)) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=cp1251
Неактивен
В структуре таблицы идут поля не так, как Вы их в VALUES передаёте.
И к слову, auto_increment'ное поле передавать уж точно не нужно, оно автоматом генерируется. попробуйте для теста так:
Неактивен
Результат тот же.
Запрос делался по образцу выдаваемому пхпма:
INSERT INTO `spis`(`Numpp`, `fio`, `dataz`, `datav`, `cenap`, `room`, `sump`, `stop`, `cenas`, `sumall`) VALUES ([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10])
Отредактированно Zakuskin (12.07.2018 13:01:08)
Неактивен
Я два поля не добавил, а если так?
Неактивен
Отредактированно Zakuskin (12.07.2018 13:14:53)
Неактивен
В то же время ровно этот запрос проходит через phpmyadmin? Если "копипастом" его туда отправить.
Неактивен
Тест ошибки есть только в одном месте тредика, поэтому буду ориентироваться на сообщение #3. В ней написано, что запрос состоит из двух частей, и ошибка на второй строке.
Не может так оказаться, что у Вас два запроса в одной строке, и нету точки с запятой в первом из них?
Можете явно делать AdoQuery1.Clear до того, как добавлять туда Insert?
http://docs.embarcadero.com/products/ra … y_xml.html
Неактивен
paulus написал:
Можете явно делать AdoQuery1.Clear до того, как добавлять туда Insert?
Вот это помогло. Почему-то нужно очищать, хотя в компоненте было пусто.
Огромное спасибо за помощь
Еще один вопрос - есть ли способ, чтобы запрос на INSERT возвращал какой-то ответ?
Неактивен
А какой ответ Вы ожидаете? Есть поле RowsAffected
Если нужен id записи, то без документации не разберешься, а документацию я как раз найти и не могу
Можно сделать SELECT LAST_INSERT_ID() следующим запросом в качестве костыля.
На форумах рекомендуют пробовать через параметры, тут совсем не знаю, дельфи последние лет десять в руках не держал
https://stackoverflow.com/questions/332 … i-adoquery
Неактивен
Да собственно ответ нужен любой) Компилятор ругается, что сервер ничего не возвращает в ответ)
Неактивен