Выборка в SQL. Как быть с кавычками?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 11:54

А какая СУБД? В разных базах разные Escape-символы.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 11:54

Другой вариант - использовать параметрические запросы.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 12:01

Это когда делаешь не ADO.Connection.Execute (или DAO.Database.OpenRecordset), а используешь объект ADO.Command (DAO.QueryDef), в которые передаешь параметры и запускаешь на выполнение.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.03.2005 (Чт) 14:05

Roman Koff писал(а):Вариант для MSACCESS


Просто раздваиваешь двойные кавычки:

Код: Выделить всё
Replace(sParam, """", """""")
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 14:31

Roman Koff писал(а):Не, такой вариант не подойдет, придется всю программу перелапачивать. У меня все на DAO и весь алгоритм на recordset завязан.

В DAO есть QueryDef, в котором можно задать параметры и открыть как Recordset.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.03.2005 (Чт) 14:33

Хоть и не докончено, но про DAO есть.
http://alibek09.narod.ru/vb/articles/db ... _dao_using
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.03.2005 (Чт) 15:10

Roman Koff писал(а):И что?
SQL спотыкается на кавычке, считая ее закрывающей для параметра выборки и дальнейшие символы воспринимает как продолжение команд инструкции ...


Раздваивать кавычки надо только в выражении условия, например:

Код: Выделить всё
SELECT * FROM Table1 WHERE Поле LIKE """ & Replace(s,"""","""""") & """"
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrev
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 19.01.2005 (Ср) 9:22
Откуда: Kursk

Сообщение Andrev » 17.03.2005 (Чт) 16:56

Исходя из моего опыта, в Акцессовских запросов допускается использование одинарных кавычек. Т.е., нет разницы, в какие кавычки вы заключаете стринговый параметр - в двойные или одинарные. В данном случае я бы рекомендовал использование одинарных кавычек, ибо это не вызывает никаких коллизий.
В этой жизни нет ничего невозможного. Если у вас что-то не получается, значит, вы что-то делаете не так.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.03.2005 (Чт) 16:58

Andrev писал(а):Исходя из моего опыта, в Акцессовских запросов допускается использование одинарных кавычек. Т.е., нет разницы, в какие кавычки вы заключаете стринговый параметр - в двойные или одинарные. В данном случае я бы рекомендовал использование одинарных кавычек, ибо это не вызывает никаких коллизий.


В выражении могут быть и они, так что там все равно какие использовать, главное - используемые надо "раздваивать", как в примере что я приводил...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 17.03.2005 (Чт) 18:39

НЕ изобретайте велосипед, всё равно поломают.
Используйте параметры....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.03.2005 (Пт) 8:20

Sebas писал(а):НЕ изобретайте велосипед, всё равно поломают.
Используйте параметры....


Зачастую требуется именно собрать строку, так как число параметров и условие может изменяться...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.03.2005 (Пт) 8:40

Andrey Fedorov писал(а):
Sebas писал(а):НЕ изобретайте велосипед, всё равно поломают.
Используйте параметры....


Зачастую требуется именно собрать строку, так как число параметров и условие может изменяться...



А как это влияет на параметры?
(((
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.03.2005 (Пт) 9:07

Sebas писал(а):
Andrey Fedorov писал(а):Зачастую требуется именно собрать строку, так как число параметров и условие может изменяться...

А как это влияет на параметры?
(((


Да то что параметрами в процедуру всего не передашь.

Приходилось целиком собирать строку запроса, включая входящие в него поля и таблицы, для всего этого дела выставлять условия и группировку... В общем параметрами это просто не сделать - надо именно сформировать строку и передать ее серверу на выполнение.

Да и в примитивном случае написать: Execute "spProc 1, 'Д%'"
Гораздо проще и быстрей чем то-же самое но с параметрами.

Однозначно параметры приходится использовать если среди них есть возвращающие значения - тут уж никуда не деться...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.03.2005 (Пт) 9:16

А кто мешает объявить новый ADO.Command, собрать в нем строку запроса и передать в нее параметры?
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.03.2005 (Пт) 9:24

alibek писал(а):А кто мешает объявить новый ADO.Command, собрать в нем строку запроса и передать в нее параметры?


Я вот тоже не пойму....
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.03.2005 (Пт) 10:06

Roman Koff писал(а):Гыыы, из задачи изобрести велосипед выросла задача изобрести самолет, да еще, чтобы он умел стрелять бластерной пушкой ;)))


Вот-вот - они это любят - да из этой пушки шарахать по воробьям ;)

Roman Koff писал(а):Мне просто экспорт надо сделать данных из старой программы в новую, если нет тривиального решения, я просто кавычки пофиксю и все.


Самое простое - раздвоить кавычки в выражении, как я писал выше.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.03.2005 (Пт) 11:01

Вот так ломается скул)))
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 23.03.2005 (Ср) 15:22

Короче:
допустим в поле NAME таблицы GOODS есть запись типа:

"Виноград" КИШМИШ Зелёный


Чтобы вытащить ее пишешь:

Код: Выделить всё
SELECT NAME
FROM GOODS3
WHERE NAME Like """Виноград""*"


Все работает можешь проверить непосредственно в Accesse. То есть каждые кавычки, как тебе и говорят, меняешь на двойные (не считая тех которые закрывают само условие то есть получаются тройные кавычки (слева от виноград в моем примере))

С апострофом вообще мутить ничего не надо. Еще может быть нюанс, если запрос делаешь не в самом access, а в VB, тогда попробуй, все кавычки, которые есть заменить на двойные то есть получатся четверные (ерунда какая-то :), но попробуй, а лучше напиши конкретно какой запрос?)


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList