Проблема с кавычками в запросе

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Проблема с кавычками в запросе

Сообщение Чудик » 26.10.2005 (Ср) 18:27

В принципе в поиске я нашел тему про кавычки, но там так и не было дано конкретного ответа и, как результат, я до сих пор не могу обойти сложившуюся проблему, которая заключается в следующем:
Работаю с mdb из под VB. Есть запрос типа
SELECT * FROM db WHERE x= ‘” & y & “’;”
db - база данных
y – строковая переменная, содержащая кавычки (например, ООО “Моя компания”).
При выполнении такого запроса выходит ошибка (и понятно почему – кавычки в значении переменной у, которые влияют на синтаксис запроса).
Как можно обойти такую ситуацию?
Век живи - век учись!
www.detal-plast.narod.ru

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2005 (Ср) 18:41

Есть два пути.

Один - для познавших Дао. Удваивать кавычки, руками отслеживая все варианты.

Другой для всех остальных, ADODB.Command.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 26.10.2005 (Ср) 20:35

1.Типа так (для DAO):
SELECT * FROM db WHERE x= ‘"" & y & ""’;”
и
ООО ""Моя компания""?
2. В ADO такой проблемы не возникает?
Век живи - век учись!
www.detal-plast.narod.ru

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 26.10.2005 (Ср) 21:38

И не получается чего-то! Пишет, что ошибка в условии запроса WHERE.
Век живи - век учись!
www.detal-plast.narod.ru

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2005 (Ср) 21:59

Я не знаю, как это на DAO, но наверняка тоже можно.
На ADO - знаю.
Алибек знает и то, и другое, но он будет завтра с утра.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 27.10.2005 (Чт) 8:00

Как уже сказал GSerg, лучше всего использовать параметрический запрос -- ADODB.Command или DAO.QueryDef, передавая параметры в коллекцию Parameters, тогда никаких проблем с типами данных не будет возникать.
Если указываешь строковые константы в теле запроса, то надо иметь ввиду, что в SQL строки ограничиваются апостофами ('test string'). У тебя, насколько я вижу, используются одиночные кавычки (‘test string’). Не надо использовать кривые кавычки, используй прямые, которые находятся на клавише слева от Enter (ASCII-код 39).
Если в строке содержаться двойные кавычки, они никак не мешают. Если в строке содержаться апостофы, то тут зависит от самой БД.
В Access допускается использовать как одинарные кавычки ('), так и двойные ("). Т.е. если у тебя в строке есть одинарные кавычки, то строку заключаешь в двойные, и наоборот.
Но лучше используй параметрический запрос.
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 27.10.2005 (Чт) 10:11

С кавычками ничего так и не выходит - все варианты перебробовал, постоянно выдает ошибку в синтаксисе запроса!
Как результат подошел опять к тому, что ты Alibek, постоянно всем советуешь - параметрическим запросам.
Но проблема заключается в том, что я достаточно, видно, притупел за последнее время и до меня не доходит принцип таковых запросов, тем более, что более или менее толковой информации я до сих пор в интернете не нашел.
Тему о параметрических запросах я поднимал в соседней теме, и то, что скинул мне GSerg касается ADO в то время, как у меня DAO и система там немного, как я понимаю, чуть отличается. Поэтому я так и не продвинулся никуда.
Сейчас я туда вылажу код, к которому я подошел на данный момент ....
Век живи - век учись!
www.detal-plast.narod.ru

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

Сообщение alibek » 27.10.2005 (Чт) 10:15

Если для DAO, то так.

Запрос:
Код: Выделить всё
PARAMETERS [Тип товара] Text ( 40 );
  SELECT *
  FROM GOODS
  WHERE [Type]=[Тип товара];

Использование:

Код: Выделить всё
'db - база данных
'rsGoods - набор данных из таблицы GOODS
'strType - тип товара, который нужно вернуть в набор данных

Dim qdfGoods As DAO.QueryDef

Set qdfGoods = db.QueryDefs("GoodsType")
qdfGoods.Parameters("Тип товара") = strType

Set rsGoods = qdfGoods.OpenRecordset
...

Set qdf = Nothing
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 27.10.2005 (Чт) 10:31

Или, если с нуля.
Код: Выделить всё
'В References подключить библиотеку DAO
Dim objWorkspace As DAO.Workspace
Dim objDatabase As DAO.Database
Dim objRecordset As DAO.Recordset
Dim objQuery As DAO.QueryDef
...
Set objWorkspace = DBEngine.Workspaces(0)
Set objDatabase = objWorkspace.OpenDatabase(...)
Set objQuery = objDatabase.CreateQueryDef(vbNullString, _
    "PARAMETERS [Тип товара] Text ( 40 );" & vbNewLine & _
    "SELECT * FROM GOODS WHERE [Type]=[Тип товара];")
objQuery.Parameters("Тип товара") = "текст"
Set objRecordset = objQuery.OpenRecordset
...
Set objQuery = Nothing
objRecordset.Close
Set objRecordset = Nothing
...
objDatabase.Close
Set objDatabase = Nothing
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Andrey Fedorov » 27.10.2005 (Чт) 11:02

Код: Выделить всё
"SELECT * FROM db WHERE x LIKE '" & Replace(y,"'","''") & "'"


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

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 27.10.2005 (Чт) 11:12

2 Alibek:

Черт! Разобрался!
Второй пример достаточно наглядный - сразу понятно что зачем.
- открываешь базу
- создаешь запрос, включая туда имя параметра
- присваиваешь параметру значение
- открываешь рекодсет.
В таком методе и в самом деле есть свои преимущества!
Правда не понял по поводу констант в тексте запроса. Если можно, для чего они?

2 Andrey Fedorov

Не понял: если написано ООО "Моя компания" зачем же менять " ' " на " ' ' "?
Век живи - век учись!
www.detal-plast.narod.ru

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

Сообщение Andrey Fedorov » 27.10.2005 (Чт) 11:27

Чудик писал(а):2 Andrey Fedorov

Не понял: если написано ООО "Моя компания" зачем же менять " ' " на " ' ' "?


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

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

Сообщение alibek » 27.10.2005 (Чт) 11:56

Чудик, какие константы? [Тип товара]?
Так это и есть параметры в параметрическом запросе. И нужны они именно для того, чтобы передавать параметр не строкой, а родным типом.
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 27.10.2005 (Чт) 12:03

Не,не,не . ...
Я про vbNullString и vbNewLine.
Век живи - век учись!
www.detal-plast.narod.ru

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

Сообщение alibek » 27.10.2005 (Чт) 12:07

Это константы VB, для лучшей читаемости. Можешь первую заменить на "", а вторую совсем убрать.
Lasciate ogni speranza, voi ch'entrate.

Чудик
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 639
Зарегистрирован: 06.07.2004 (Вт) 12:18
Откуда: г. Егорьевск

Сообщение Чудик » 27.10.2005 (Чт) 12:15

Спасибо всем за помощь!

В какой раз понимаю, что без вашего участия я бы еще долго бодался не только с параметрическими запросами, но и с другими темами, которые были подняты на форуме когда то мной.
Век живи - век учись!
www.detal-plast.narod.ru

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 19.06.2006 (Пн) 18:39

Слушайте, а почему бы просто не экранировать кавычки?
Я в MySQL всё-время так делаю и никаких проблем.
Тип было
Код: Выделить всё
'string ' apostrof'
, стало
Код: Выделить всё
'string \' apostrof'
Я знаю верный путь

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.06.2006 (Вт) 2:29

К примеру, MS SQL Server такого не позволяет.
И, к примеру, так ты не сможешь бороться с SQL Injection.
И, если у тебя есть строка, в которой изначально перед апострофом есть \, то у тебя получится \\', правильно? И апостроф чудесным образом воскреснет.
Не надо предлагать изначально кривые решения...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 20.06.2006 (Вт) 9:10

Ну вообще-то нет. Экранируются не только апостофы. И "\'" превратится в "\\\'".
Но да, параметрические запросы рулят.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.06.2006 (Вт) 9:13

Ну вообще-то это зависит от метода экранирования.
Но опять же, SQL Server такой запрос не понимает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение alibek » 20.06.2006 (Вт) 9:22

В MSSQL экранирование делается по другому, \0xNN (вроде бы).
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.06.2006 (Вт) 9:26

А переделывать содержимое апострофо в зависимости от базы - это моветон.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 20.06.2006 (Вт) 19:13

GSerg писал(а):Но опять же, SQL Server такой запрос не понимает.

MySQL рулит!
Я знаю верный путь

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

Сообщение alibek » 20.06.2006 (Вт) 20:25

Q2W писал(а):MySQL рулит!

Ерунда. MySQL это не СУБД, а издевательство над разработчиков. Плюсов только три: бесплатный, быстрая работа без транзакций и хорошее взаимодействие с PHP.
Lasciate ogni speranza, voi ch'entrate.

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.06.2006 (Ср) 12:13

Типа с другими языками программирования он взаимодействует плохо.
Ещё он простой, что я тоже отношу к плюсам.
Я знаю верный путь

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.06.2006 (Ср) 12:19

MySQL - язык программирования?
Ну-ну.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.06.2006 (Ср) 12:21

alibek писал(а):Плюсов (у MySQL, кто не понял) только три: бесплатный, быстрая работа без транзакций и хорошее взаимодействие с PHP.

MySQL с PHP
Q2W писал(а):Типа с другими языками программирования он взаимодействует плохо.

MySQL с другими языками программирования.
GSerg, читай посты вниматальнее.
Я знаю верный путь

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.06.2006 (Ср) 12:26

Действительно.

Но. http://www.bash.org.ru/quote.php?num=20174
И это правда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.06.2006 (Ср) 12:30

Ну на вкус и цвет фломастеры разные..
Я знаю верный путь


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

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

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

    TopList