Запрос на добавление нескольких записей в Access
|
|
От: |
_Anastasia |
|
| Дата: | 15.08.07 12:39 | ||
| Оценка: |
Здравствуйте!
Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа'),
('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
Но возникает исключение «Пропущен символ ( в конце инструкции SQL.».
Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
Re: Запрос на добавление нескольких записей в Access
|
|
От: |
MasterZiv |
|
| Дата: | 15.08.07 14:10 | ||
| Оценка: |
> Мне нужно добавить несколько записей в таблицу Access. Использую
Напиши два запроса и выполни их подряд поочереди.
Разницы никакой нет.
Posted via RSDN NNTP Server 2.1 beta
Re: Запрос на добавление нескольких записей в Access
|
|
От: |
. |
|
| Дата: | 15.08.07 17:01 | ||
| Оценка: |
_Anastasia wrote:
> ‘продажа’),
Если я правильно помню, то запятая не нужна.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Запрос на добавление нескольких записей в Access
|
|
От: |
ZAMUNDA |
для жалоб и предложений |
| Дата: | 15.08.07 21:12 | ||
| Оценка: |
2 (1) |
Здравствуйте, _Anastasia, Вы писали:
_A>Здравствуйте!
_A>Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
*Тег [sql], а не [code].
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа')
, -- << Вот тут должна быть точка с запятой.
-- А того, что внизу, быть не должно!
('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
Это ж «Single-record append query» там только одну запись добавить можно.
_A>Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
1. Надо сделать таблицу с одним полем, я её называю обычно «blanc».
CREATE TABLE blanc (ValueMy Integer NOT NULL);
и добавить в неё одну запись (с любым значением)
INSERT INTO blanc (ValueMy) VALUES (0);
2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
FROM (
SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
UNION
SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
) AS InsertedTbl;
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: Запрос на добавление нескольких записей в Access
|
|
От: |
_d_m_ |
|
| Дата: | 15.08.07 23:18 | ||
| Оценка: |
Здравствуйте, _Anastasia, Вы писали:
_A>Здравствуйте!
_A>Мне нужно добавить несколько записей в таблицу Access. Использую следующий запрос:
_A>
_A>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE], [CODEGOOD], [OKEY], [QUANTITY], [SUMMA], [SUMDISC], [KINDPAY], [KINDCHECK] ) VALUES
_A>('47', '15.08.2007 15:32:36', 'Торговый зал', '00032', 'пара', '1.000000', '2109.000000', '0.000000', 'Наличная оплата', 'продажа'),
_A>('47', '15.08.2007 15:32:36', 'Торговый зал', '00018', 'пара', '1.000000', '1687.000000', '0.000000', 'Наличная оплата', 'продажа');
_A>
_A>Но возникает исключение «Пропущен символ ( в конце инструкции SQL.».
_A>Как это исправить? Какой должен быть запрос, чтобы добавить несколько записей?
Значит Акцес не поддерживает такой синтаксис. Можно попробовать (а Акцесе не спец) воспользоваться таким пакетом:
begin tran;
insert
ARHIVCHECK(...)
values
('47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...)
;
insert
ARHIVCHECK(...)
values
('47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...)
;
...
commit;
Операторы insert выполняются в контексте одной транзакции — это важно. Иначе, каждый оператор insert выполняется в своей отдельной транзакции, что сильно замедляет выполнение пакета.
Re[2]: Запрос на добавление нескольких записей в Access
|
|
От: |
_d_m_ |
|
| Дата: | 15.08.07 23:19 | ||
| Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
ZAM>
ZAM>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
ZAM>SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
ZAM>FROM (
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>UNION
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>) AS InsertedTbl;
ZAM>
Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
insert
ARHIVCHECK(...)
select
'47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...
union all
select
'47' AS [CHECKNUM], DateSerial(2007, 15 ,08) ...
;
Re[3]: Запрос на добавление нескольких записей в Access
|
|
От: |
ZAMUNDA |
для жалоб и предложений |
| Дата: | 16.08.07 07:02 | ||
| Оценка: |
Здравствуйте, _d_m_, Вы писали:
___>Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ! 
Ну мож ещё MSFOX вспомним? Так там ащще мона в массив записать всё и APPEND сделать.
А в Access обязательно указание таблицы, и если в таблице нет записей, то в «SELECT {const} AS Somth FROM blank» набор будет пустым — вот такая ботва.
PS: Транзакций Access’овском SQL тож нет (да вроде и ADO.Connection.BeginTransaction и т.д тож не сработают если к Access подключено).
PPS: Кстати правильно «Blank», опечатался я…
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: Запрос на добавление нескольких записей в Access
|
|
От: |
_d_m_ |
|
| Дата: | 16.08.07 09:35 | ||
| Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>Здравствуйте, _d_m_, Вы писали:
___>>Я не знаю как в Акцесе, но в MS SQL предложение FROM необязательно, соответсвенно нет необходимости в таблице [blanc]:
ZAM>МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ!
А что у Мамая был КЛИНУС??? 

Re[2]: Запрос на добавление нескольких записей в Access
|
|
От: |
_Anastasia |
|
| Дата: | 16.08.07 12:10 | ||
| Оценка: |
Здравствуйте, ZAMUNDA, Вы писали:
ZAM>1. Надо сделать таблицу с одним полем, я её называю обычно «blanc».
ZAM>
ZAM>CREATE TABLE blanc (ValueMy Integer NOT NULL);
ZAM>
и добавить в неё одну запись (с любым значением)
ZAM>INSERT INTO blanc (ValueMy) VALUES (0);
ZAM>
ZAM>2. Используй UNION в подзапросе для вставки данных запросом типа «INSERT ZZZ(…) SELECT … FROM XXX».
ZAM>
ZAM>INSERT INTO ARHIVCHECK( [CHECKNUM], [DATECHECK], [WAREHOUSE])
ZAM>SELECT [CHECKNUM], [DATECHECK], [WAREHOUSE] -- млин, я не писатель вам тут. Непомню можно-ли тут * поставить.
ZAM>FROM (
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36) AS [DATECHECK], 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>UNION
ZAM>SELECT '47' AS [CHECKNUM], DateSerial(2007, 15 ,08) + TimeSerial(15, 32, 36), 'Торговый зал' AS [WAREHOUSE] FROM blanc
ZAM>) AS InsertedTbl;
ZAM>
Спасибо большое…Все заработало…
Только неудобно немного получается: надо создавать лишнюю таблицу, делать к ней пустое обращение. Но, наверное, сама база так сделана.
А транзакций в Аксесе действительно нет.
Re[5]: Запрос на добавление нескольких записей в Access
|
|
От: |
ZAMUNDA |
для жалоб и предложений |
| Дата: | 16.08.07 12:13 | ||
| Оценка: |
|
Здравствуйте, _d_m_, Вы писали:
ZAM>>МАМАЙ КЛИНУС, ДАРАГОЙ, в MSSQL ЙА БЭЗ Blanс ВИСЁ ДЭЛАЙУ! 
___>А что у Мамая был КЛИНУС??? 

Клинус — это ж знаменитый советник Мамая по хозяйственным делам.
Клинус
Знаменитый звездочёт и бухгалтер Клинус, был другом детства Мамая, но судьба разделила их в юношестве — Мамай поехал учиться военному делу в южные районы Крыма, а Клинус пешком пошёл по берегу моря на запад в Магрибские земли, изучать науки и чародейство. Однако, дружба с воинственным Мамаем оставила свой след, наряду с талантом к наукам, юный Клинус проявлял недюжую ловкость и силу. Некоторые источники сообщают, что именно он стал прототипом Гендальфа из Толкиенистского «Властелина колец».
Окончив обучение в 1360 году, Клинус придумал трусцу и ею отправился обратно в крымское ханство, чтоб найти себе женщину и старого друга Мамика (так он звал Мамая). Через пять лет судьба послала Клинусу окончание пути, а Мамаю власть, чтобы напрячь людей на поиски старого друга Клиныша (он так называл Клинуса). Ещё через год судьба и арабский скакун, чьё имя история умалчивает, обеспечили встречу старых друзей.
Просохнув через месяц и узнав что Клинус неплохо знает математику, Мамай определил старого друга на работу. Клинус быстро втянулся в загадочный мир подсчёта съеденного, лошадьми из канюшен Мамая , овса и наложенного ими же навоза. Однако настоящую революцию он совершил в деле подсчёта необходимого количества людей и лошадей перед первым походом Мамая на русские земли. Это он заложил основы реляционных баз данных, придумав связывать одного солдата и одной или нескольими лошадьми, клинок с одним живым или мёртвым воином и Мамая со множеством сундуков золота.
Умер Клинус в безвестии от удара шальной подковой по темечку, во время куликовской битвы в 1380 г. К сожалению, стан Клинуса был разорён русскими богатырями, которые и использовали по нужде весь папирус с трудами Клинуса.
Вот так-то!!! Историю учить надо, а не всякую фигню писать.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[3]: Запрос на добавление нескольких записей в Access
|
|
От: |
ZAMUNDA |
для жалоб и предложений |
| Дата: | 16.08.07 13:01 | ||
| Оценка: |
Здравствуйте, _Anastasia, Вы писали:
__A>Спасибо большое…Все заработало…:)
Пожалуйста. Канешно заработало, я такой финт ушами давно использую.
_A>Только неудобно немного получается: надо создавать лишнюю таблицу, делать к ней пустое обращение.
Неудобно ёжиков рожать! 
Хотите «удобно» — переходите на MS SQL Server Express.
_A>А транзакций в Аксесе действительно нет.
Ну значит и правда нет. Значит память у меня ещё есть… 
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re[4]: Запрос на добавление нескольких записей в Access
|
|
От: |
Igor.K |
|
| Дата: | 16.08.07 16:09 | ||
| Оценка: |
_A>>А транзакций в Аксесе действительно нет.
ZAM>Ну значит и правда нет. Значит память у меня ещё есть…
Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
А используются они, примерно, так:
On Error GoTo errorTransaction
Dim myWrk As DAO.Workspace, myDbs As DAO.DATABASE
Set myWrk = DBEngine.Workspaces(0)
Set myDbs = CurrentDb
myWrk.BeginTrans
myDbs.Execute "UPDATE ...", dbFailOnError
myDbs.Execute "INSERT ...", dbFailOnError
myDbs.Execute "DELETE ...", dbFailOnError
myWrk.CommitTrans
exitTransaction:
myDbs.Close
myWrk.Close
Exit Sub
errorTransaction:
myWrk.Rollback
MsgBox "Transaction was not completed successfully", vbCritical, "Problem with batch run"
goto exitTransaction
end sub
«СССР — четыре слова и все лживые» — Вагрич Бахчанян
Re[5]: Запрос на добавление нескольких записей в Access
|
|
От: |
Бенедикт |
|
| Дата: | 17.08.07 07:21 | ||
| Оценка: |
_A>>>А транзакций в Аксесе действительно нет.
ZAM>>Ну значит и правда нет. Значит память у меня ещё есть… 
IK>Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
Справка по языку Microsoft Jet SQL
Инструкция TRANSACTION
Используется для запуска и завершения явных транзакций.Синтаксис
Запускает новую транзакцию.BEGIN TRANSACTION
Заканчивает транзакцию путем завершения всей работы, выполненной в ходе транзакции.
COMMIT [TRANSACTION | WORK]
Заканчивает транзакцию путем свертывания всей работы, выполненной в ходе транзакции.
ROLLBACK [TRANSACTION | WORK]
Дополнительные сведения
Автоматический запуск транзакции невозможен. Чтобы начать транзакцию, ее необходимо явно запустить с помощью инструкции BEGIN TRANSACTION.Допускается пять уровней вложения транзакций. Чтобы запустить вложенную транзакцию, воспользуйтесь инструкцией BEGIN TRANSACTION в контексте существующей транзакции.
Для присоединенных или связанных таблиц транзакции не поддерживаются.
Re[6]: Запрос на добавление нескольких записей в Access
|
|
От: |
Igor.K |
|
| Дата: | 19.08.07 05:36 | ||
| Оценка: |
Здравствуйте, Бенедикт, Вы писали:
_A>>>>А транзакций в Аксесе действительно нет.
ZAM>>>Ну значит и правда нет. Значит память у меня ещё есть…
IK>>Транзакции в MS Access действительно есть, только в языке Jet SQL они никак не представлены.
Б>Справка по языку Microsoft Jet SQL[q]Инструкция TRANSACTION
Б>Используется для запуска и завершения явных транзакций.
Ты смотри, действительно появились. Просто по MS Office 97 я их действительно не помню.
… << RSDN@Home 1.2.0 alpha rev. 653>>
«СССР — четыре слова и все лживые» — Вагрич Бахчанян


- Переместить
- Удалить
- Выделить ветку
Пока на собственное сообщение не было ответов, его можно удалить.
|
iiyuijkhgfjf 0 / 0 / 0 Регистрация: 15.03.2013 Сообщений: 69 |
||||
|
1 |
||||
|
16.10.2014, 15:39. Показов 5762. Ответов 13 Метки нет (Все метки)
Добрый день. Столкнулся со следующей проблемой, указанной в теме (повторюсь — Пропущен символ ( ; ) в конце инструкции SQL). Но, сначала расскажу, что я собирался делать. Идея у меня такая: есть форма, на ней расположен компонент PageControl на нем две вкладки — «Добавление данных» и «Удаление данных». На вкладке «Добавление данных» располагается 3 Edit’a и кнопка Button. В Edit’ы мы вводим данные (код группы, название группы, код специальности) нажимаем на кнопку и происходит добавление записей в таблицу базы данных (Название таблицы — группы, состоит из столбцов код группы, название группы, код специальности). Это по идее, а на деле получается ошибка. Просматривал на данном форуме подобные темы, однако так и не смог разобраться с проблемой. Код запроса следующий:
Задачка-то не такая уж ах-ти сложная, но вот чего-то я на ней спотыкнулся. Прошу вас, товарищи-форумчане направить меня на путь истинный. Мне уже самому интересно — где же тут собака зарыта.
0 |
|
Grossmeister Модератор 4214 / 3054 / 582 Регистрация: 21.01.2011 Сообщений: 13,205 |
||||
|
16.10.2014, 16:09 |
2 |
|||
|
Нужно так
А у тебя написана вставка 3-х строк, в каждой из которых будет заполнено 1 значение. Причем, поскольку они включены в ОДИН запрос, то между ними д.б. разделитель, т.е. точка с запятой. О чем тебе в сообщении и сказано. Добавлено через 3 минуты
ADOQuery1->Active = false; Это 2 строки, выполняющие одно и то же. Т.е. достаточно оставить одну. То, что внизу: А Post — вообще непонятно зачем.
0 |
|
iiyuijkhgfjf 0 / 0 / 0 Регистрация: 15.03.2013 Сообщений: 69 |
||||
|
16.10.2014, 16:48 [ТС] |
3 |
|||
|
Grossmeister,
Причем, поскольку они включены в ОДИН запрос, то между ними д.б. разделитель, т.е. точка с запятой. О чем тебе в сообщении и сказано. Можно, пожалуйста, здесь указать конкретнее где именно она должна быть? Вот, немного исправленный код после замечаний:
0 |
|
Grossmeister Модератор 4214 / 3054 / 582 Регистрация: 21.01.2011 Сообщений: 13,205 |
||||
|
16.10.2014, 16:55 |
4 |
|||
|
Можно, пожалуйста, здесь указать конкретнее где именно она должна быть?
Но, во-первых, как я понял, тебе нужен 1 INSERT, а не 3.
0 |
|
iiyuijkhgfjf 0 / 0 / 0 Регистрация: 15.03.2013 Сообщений: 69 |
||||
|
16.10.2014, 17:11 [ТС] |
5 |
|||
|
Grossmeister, сделал, однако теперь после ввода данных в Эдиты и нажатия кнопки выдается следующая ошибка «Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции». Код запроса:
0 |
|
Модератор 4214 / 3054 / 582 Регистрация: 21.01.2011 Сообщений: 13,205 |
|
|
16.10.2014, 17:18 |
6 |
|
ADOQuery1->Active = true; Я же тебе дал ссылку. В которой черным по белому написано, что Open или Active = true применяется для запросов, которые возвращают набор данных, т.е. для SELECT. А для DML-операций (INSERT, UPDATE, DELETE), которые не возвращают набор данных, используется ExecSQL
0 |
|
iiyuijkhgfjf 0 / 0 / 0 Регистрация: 15.03.2013 Сообщений: 69 |
||||
|
16.10.2014, 17:33 [ТС] |
7 |
|||
|
Grossmeister, простите меня за невнимательность, действительно это я не учел. Исправил. Благодарю, помоги разобраться. Код запроса:
Сейчас попробую организовать удаление данных из таблицы. Grossmeister, могу ли я вас попросить быть на связи, на случай, если возникнут вопросы (если что отпишусь тут же)?
0 |
|
Bit_Man 478 / 391 / 112 Регистрация: 24.04.2012 Сообщений: 1,622 Записей в блоге: 3 |
||||
|
17.10.2014, 16:31 |
8 |
|||
|
Можно от себя добавлю.
ADOQuery1->Active = false; закрывать лучше через Close() , а Active использовать для получения текущего состояния. Где-то в справке об этом написано.
0 |
|
0 / 0 / 0 Регистрация: 15.03.2013 Сообщений: 69 |
|
|
18.10.2014, 11:45 [ТС] |
9 |
|
Спасибо, надо будет по-подробней прочитать про данный момент.
0 |
|
8385 / 6147 / 615 Регистрация: 10.12.2010 Сообщений: 28,683 Записей в блоге: 30 |
|
|
19.10.2014, 00:39 |
10 |
|
закрывать лучше через Close() , а Active использовать для получения текущего состояния. Где-то в справке об этом написано. А разница? Чем конкретно лучше?
0 |
|
1449 / 1121 / 347 Регистрация: 11.04.2011 Сообщений: 2,621 |
|
|
20.10.2014, 05:44 |
11 |
|
Bit_Man Читаем справку вместе (я даже перевел на русский): Call Close to set the Active property of a dataset to false (прим. Вызов Close устанавливает свойству Active значение false) По поводу лучше/хуже там ни чего не написано. А вы считаете, что вызывать метод, который делает Active = false — это лучше, чем вызывать Active = false напрямую?
0 |
|
Супер-модератор 32793 / 21133 / 8144 Регистрация: 22.10.2011 Сообщений: 36,393 Записей в блоге: 8 |
|
|
20.10.2014, 10:25 |
12 |
|
Я считаю, что лучше. Логичнее. Я, по крайней мере, всегда делаю именно так: нужно проверить, в каком состоянии находится объект — проверяется свойство. Для изменения состояния объекта — вызывается метод…
0 |
|
8385 / 6147 / 615 Регистрация: 10.12.2010 Сообщений: 28,683 Записей в блоге: 30 |
|
|
20.10.2014, 17:57 |
13 |
|
По поводу лучше/хуже там ни чего не написано. Ну так к чему замечание?
А вы считаете, что вызывать метод, который делает Active = false — это лучше, чем вызывать Active = false напрямую? Я говорю что разницы нет. Добавлено через 2 минуты
А вы считаете, что вызывать метод, который делает Active = false — это лучше, чем вызывать Active = false напрямую? А зачем лишний раз проверять? Как я помню при закрытии вроде не генериться исключение или что-либо, ради чего стоило бы делать проверку.
0 |
|
kodv |
|
20.10.2014, 20:05
|
|
Не по теме: Avazart, вы не являетесь адресатом моего сообщения. Я тоже считаю, что использвание Active = true/false и Open/Close — это дело вкуса.
0 |
|
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
20.10.2014, 20:05 |
|
14 |
I’m trying to get this bit work but it keep saying that missing a (;) at the end of a SQL statement. Basically, this code will get filename of a picture and insert into photodatabase in fileName column, if the filename already exist then just update = 1.
INSERT INTO photoDB(fileNames)
VALUES('" + Path.GetFileName(fileName) + "')
ON DUPLICATE KEY UPDATE fileNames = 1
marc_s
737k176 gold badges1337 silver badges1463 bronze badges
asked Oct 28, 2011 at 21:21
7
The error is message is quite clear. You need a semi-colon at the end of your SQL string (fileNames = 1;.
answered Oct 28, 2011 at 21:25
Larry LustigLarry Lustig
49.6k14 gold badges111 silver badges163 bronze badges
3
Here is an example that helps to protect against SQL injection and fixes your semi colon problem.
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();
answered Oct 28, 2011 at 21:34
hspainhspain
17.5k5 gold badges19 silver badges31 bronze badges
0
Second answer (now that the OP has fixed the semi-colon issue).
-
Is this MySQL? Other databases will not support that ON DUPLICATE KEY syntax.
-
Your ON DUPLICATE KEY clause sets a TEXT column (fileNames) to an INTEGER value (1). Try putting quotes around the integer value.
answered Oct 29, 2011 at 1:08
Larry LustigLarry Lustig
49.6k14 gold badges111 silver badges163 bronze badges
← →
ed
(2002-01-21 08:39)
[0]
Есть проблема:
В Дельфи при использовании компонента TADODataSet:
1) Два и более запроса не выполняются.
2) Создаю временную таблицу и после ее создания, она тут же удаляется
В BDE — наоборот (проблем нет)
Скажите пожалуйста, как выйти из ситуации?
← →
KSergey
(2002-01-21 09:37)
[1]
Ничего не понятно
Что значит не выполняется два запроса? Код.
Какую именно временную таблицу? К стати, какая БД используется? Кокой вы вообще хотели получить ответ без этого уточнения?!
← →
Steel Ice
(2002-01-21 10:19)
[2]
Вообще ADOшные компоненты — глюкота.
Например попробуй сделать в ADOQuery выборку из базы, в которой нету записей — орет как укушенная. Еще какая-то у них мутная процедура Close у этих компонент. Если при закрытии курсор стоит на последней строчке таблицы, при выполнении Close частенько выдает EOF ошибку.
А удалить или изменить строчку в ADOTable? Кошмар.
Единственная возможноть нормально работать с АДО, делаешь ADOConnection, и через него ADOCommandom выполняешь любые запросы. Результаты возвращаются в Excute:_Recordset.
И таблицы, когда я их через АДОКомманд создавал — не пропадали.
И работает шустренько.
← →
Fay-1
(2002-01-22 01:19)
[3]
to Steel Ice :
Поставь апдейты для делфей
у меня всё живёт
← →
ed
(2002-01-24 07:07)
[4]
База — MS SQL Server 7 (и выше)
Два запроса = две инструкции
например, код:
delete table1
insert …
выполняет только первую инструкцию
или
в ADOCommand создаю временную таблицу (select…into #tmptable)
а после делаю апдейт, например, из другого ADOCommand или этого же компонента, поменяв CommandText. Он мне говорит, что нет такой, проверяю — действительно нет. А в ADOConnection один и тот же (вообще один) и в документашке по MS SQL говорится что докальная временная таблица сохраняется пока сессия не закроется.
Можно запрос через сам ADOConnection послать на создание, тогда все работает, но вот беда : он не поддерживает параметры…, а нужны!
← →
Delirium
(2002-01-24 12:44)
[5]
Просто надо пользовать полноценные компоненты — TADOQuery, например, тогда и глюков не будет, и какие угодно команды проходить будут.
← →
ed
(2002-01-25 07:04)
[6]
А вот и нифига подобного. Во-первых, в хелпе написано, что никакой разницы нет между TADOQuery и TADODataSet. Во-вторых,
я на всякий случай попробовал использовать query, но результат оказался тем же самым. В этот раз я пробовал на базе mdb (acceess). Вот код
SQL:
INSERT INTO table1 (id, Name) Values (0, «Name0»)
DELETE FROM table1 where id = 0
после ExecSQL ошибка: «Пропущен символ (;) в конце инструкции SQL»
Тогда ставлю в конце инструкции точку с запятой:
INSERT INTO table1 (id, Name) Values (0, «Name0»);
DELETE FROM table1 where id = 0
В этом случае другая ошибка: «Обнаружены символы за пределами инструкции SQL»
БЛИН!
← →
Delirium
(2002-01-25 12:21)
[7]
Мы-же по MSSQL вроде говорили, а кто тебе сказал что ACCESS позволяет несколько инструкций подряд исполнять? Ты бы в самом ACCESS сначала попробывал бы, а потом уже на ADO наезжал 
← →
Delirium
(2002-01-25 15:08)
[8]
И вообще для команд, не возвращающих информацию, существует TADOCommand, а TADOQuery естественно ругаться будет «CommandText does not return a result set»
I am currently trying to insert a new row of information into a table, and am using the sql view inside of MS Access. When I run this code:
SELECT *
FROM VersionReleases;
INSERT INTO
VersionReleases(CurrentVersionID, PreviousVersionID, ScriptID, ReleaseDate)
VALUES
(555, 556, 1543, 2018);
It gives me an error specified in title, and I can’t understand why.
Would appreciate some guidance, thanks a bunch.
asked Dec 25, 2018 at 15:26
0
Just drop the SELECT statement. It is of no use here.
INSERT INTO VersionReleases
(CurrentVersionID, PreviousVersionID, ScriptID, ReleaseDate)
VALUES
(555, 556, 1543, 2018);
answered Dec 25, 2018 at 15:39
MS Access only supports the evaluation of one SQL statement; hence anything following a semi-colon delineating the end of a SQL statement will result in MS Access reporting the error:
Characters found after end of SQL statement
As such, your query will need to become either:
SELECT * FROM VersionReleases;
Or:
INSERT INTO
VersionReleases(CurrentVersionID, PreviousVersionID, ScriptID, ReleaseDate)
VALUES
(555, 556, 1543, 2018);
With a new query created to contain the other SQL statement.
answered Dec 26, 2018 at 23:56
Lee MacLee Mac
8871 gold badge11 silver badges24 bronze badges
You must log in to answer this question.
Not the answer you’re looking for? Browse other questions tagged
.
Not the answer you’re looking for? Browse other questions tagged
.
a_ivanov
08.09.08
✎
18:25
Народ кто записывал данные в DBF через ADO посредством многострочного запроса? Пишет ошибку «Пропущен символ (;) в конце инструкции SQL.»Ставлю точку с запятой пишет другую ошибку: «Ошибочная инструкция SQL; предполагалось ‘DELETE’, ‘INSERT’, ‘PROCEDURE’, ‘SELECT’ или ‘UPDATE'»
Текст запроса такой:
Insert into cashTax Values(‘2’, ‘1’, ‘1’, ‘1423’, ‘1’, ‘1’, ‘1’, ’18’, ’18 %’, ‘1,53’, ‘1,53’)
Insert into cashSail Values(‘2’, ‘1’, ‘1’, ‘1423’, ‘1’, ‘05.09.2008’, ‘1608’, ’14’, ‘NOSIZE’, ’10’, ‘1’, ’10’, ’10’, ’10’, ‘0’, ‘1’, ‘1’, ‘1’, ‘1’, ‘0’, ‘0’, ‘0’)
По одной строке все нормально записывает
Rebelx
08.09.08
✎
19:17
попробуй:
BEGIN
Запрос1;
Запрос2;
END
(так оракл понимает)
smaharbA
09.09.08
✎
06:34
пеши в одну строку и с ;
(и че у тебя в таблице, все чары ? )
a_ivanov
09.09.08
✎
10:33
Не так тоже не работает. На sql.ru говорят вообще так не получиться :-(((
smaharbA
09.09.08
✎
12:33
(3) получится
Insert into cashTax Values(‘2’, ‘1’, ‘1’, ‘1423’, ‘1’, ‘1’, ‘1’, ’18’, ’18 %’, ‘1,53’, ‘1,53’);Insert into cashSail Values(‘2’, ‘1’, ‘1’, ‘1423’, ‘1’, ‘05.09.2008’, ‘1608’, ’14’, ‘NOSIZE’, ’10’, ‘1’, ’10’, ’10’, ’10’, ‘0’, ‘1’, ‘1’, ‘1’, ‘1’, ‘0’, ‘0’, ‘0’);
Вот к примеру, работает и не жужит
cmd="SET DATEFORMAT YMD;INSERT INTO [" & BaseSQL & "].[dbo].[" & TableSQL & "] ([DATELOG],[SERVICE],[USER],[METH],[SOUR],[PORTS],[DEST],[PORTD],[BYTEIN],[BYTEOUT],[BYTEALL],[CODE]) VALUES (CAST('" & datelog & "' AS DATETIME),'" & service & "','" & user & "','" & meth & "','" & sour & "'," & ports & ",'" & dest & "'," & portd & "," & bytein & "," & byteout & "," & byteall & ",'" & code & "');"
call rs.Open(cmd,con,3,1,1)



