Текущий архив: 2004.09.26;
Скачать: CL | DM;
ВнизADOQuery подскажите plz Найти похожие ветки
← →
lehich © (2004-08-25 15:02) [0]Query1.Params[0].AsString:= "%"+LabeledEdit1.Text+"%";
прокатывает нормально при любых знаках передаваемых из Edit`а, а
ADOQuery1.SQL.Add("where name like "%" + LabeledEdit1.Text + "%"");
обваливается при введении названия в кавычках, например "мастер" в первом случае ищется нормально, а во втором выскакивает сообщение о ошибке.. как быть???
← →
KSergey © (2004-08-25 15:16) [1]> lehich © (25.08.04 15:02)
> сообщение о ошибке.. как быть???
Подозреваю - удваивать кавычки в подставляемом тексте или что-то в этом роде.(не силен в тонкостях синтаксиса SQL в аксесе; возможно - заменить обрамдяющие кавычки в like на что-то другое)
А какая ошибка - секрет?
← →
lehich © (2004-08-25 16:54) [2]Понятно что ошибка синтаксиса, но как обойти её???
цитирую:
Ошибка синтаксиса (пропущен оператор) в выражении запроса "name like "%"мастер"%""
← →
KSergey © (2004-08-25 17:02) [3]Напишите как в таком случае должно быть согласно синтаксису аксеса.. Я не знаю. Подозреваю, как писал, что в исходной подставляемой строке надо удвоить все кавычки (StrReplace, например)
← →
lehich © (2004-08-25 17:28) [4]я не знаю... потому и спрашиваю...
← →
AndB © (2004-08-25 17:55) [5]звездочку вместо процента пробовал?
← →
lehich © (2004-08-26 11:22) [6]не проходит... вообще не находит ничего... а при кавычках та же трабла...
← →
Ozone © (2004-08-26 11:36) [7]..."%"мастер"%""
Итого: 1-а открывающая и 2-е закрывающих.
← →
lehich © (2004-08-26 11:39) [8]но с другими-то запросами всё работает!!! которые без спецсимволов...
← →
AndB © (2004-08-26 11:42) [9]про звездочку я машинально спросил. у меня грабли были на web(asp)+odbc+mdb - пишу процент: фиг, со звездочкой прошло.. А у тебя глюк когда в поле поиска вводят текст уже заключенный в кавычки. А зачем? По аналогии в web-овскими поисковиками в кавычках пишут то, для чего ищут точной совпадение, без кавычек - любое вхождение. Но если это делать в одной строке - морока разбирать ввод, а главное - найдется добрый человек который ведет
"мастер"
- и пойми чего он написал. Оно тебе надо? Запрети ввод кавычек, или обоих или только одинарных. Но тогда и WHERE менять надо - то, что в кавычках будет не LIKE, а СONSTAINS. А проще два(три..) поля сделать, как в том же гугле. Ну и пишу я лично так:sqlStr := " ... WHERE "+Edit1.Name+" = "+#39+Edit1.Text+#39+" AND ... "
имхо, так читабельнее, чем удваивать(утраивать?) кавычки - ошибиться просто.
← →
AndB © (2004-08-26 11:51) [10]т.е. CONTAINS конечно. я про него к чему? - не придется обрамлять процентами слово в кавычках.
← →
lehich © (2004-08-26 14:56) [11]можно поподробнее насчет constains???
← →
AndB © (2004-08-27 07:10) [12]да-да! %(
и мне расскажите откуда втемяшилось в башку это слово... наверно из другой оперы. В MSSQL-e по полям с индексом полнотекстового поиска это выглядит так:select firma_name from Firma where contains(firma_name, " "ГРЭ" ")
т.е. хорошо тебе подходит - берешь слово кк есть (с кавычкми) и включаешь в строку. Но я не пойму, что в ADO получается? Слово вроде-бы "не чужое" - попробуй написать:ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("SELECT * FROM tbl WHERE [txt] CONTAINS "+#34+"master"+#34);
ADOQuery1.Active := true;
— оно и сработает (молча), только не найдет ничего и покажет все-все.. а попробуй исправить:... CONTAINS "+#34+" "real" "+#34);
- заругается. Выходит есть такая фишка?, а как работает??.. 8(
← →
AndB © (2004-08-27 09:03) [13]нн-даа-аа-а.. Если б вчера кто нибудь стоящий за мое спиной сказал "ты, братан, фигню чепатаешь" - я б с ним разругался. Ну не приснилось-же мне.. мля!
← →
Anatoly Podgoretsky © (2004-08-27 10:17) [14]lehich © (25.08.04 16:54) [2]
А должно быть так name like "%"мастер"%"" или в некоторых базах [%"мастер"%"]
Используй QuotedStr
← →
lehich © (2004-08-30 11:03) [15][14] хмммм... QuotedStr не дает нужного результата... просто добавляет в начало и в конец одинарные кавычки...
попробовал еще из FAQ процедуру в описании которой есть такая фраза "Чтобы не было SQL-ошибки при составлении запроса "на лету", где участует строка с кавычками, надо просто напросто задвоить эти кавычки!":
function Quoted(const St: string): string;
var
i: integer;
begin
Result:="";
for i:=1 to Length(St) do
if (St[i] = """) then Result:=Result+""""
else Result:=Result+St[i];
end;
но результат тот же - ошибка...((( может где-то можно почитать про синтаксис SQL именно для ADO??? потому что с обычными подкючением базы через BDE проблем не возникает...
← →
sniknik © (2004-08-30 11:20) [16]так
ADOQuery1.SQL.Add("where [name] like ""%" + LabeledEdit1.Text + "%""");
но только с параметром правильнее, т.к. он воспринимается в любом случае как строка, а тут есть варианты. (так этот вариант сработает если
LabeledEdit1.Text = "мастер"
но глюкнется на "мастер") почему думаю понятно, это вставляется непосредственно в запрос а кавычки его перековеркивают (они же и есть же разделители строки).
> может где-то можно почитать про синтаксис SQL именно для ADO???
для jet (движок ADO для аксесс, для других другой, не путай)
файл JETSQL40.CHM
иши у себя на машине.
← →
lehich © (2004-08-30 11:56) [17]сенкс... почитаю хелп по jet...
еще вопрос... иногда возникает ошибка "параметр zapros не имеет значения по умолчанию"... почему???
zapros := Quoted(LabeledEdit1.Text);
ADOQuery1.SQL.Add("where name like zapros");
← →
sniknik © (2004-08-30 12:07) [18]> иногда возникает ошибка "параметр zapros не имеет значения по умолчанию"... почему???
??? иногда? да она всегда будет, запрос неправильный получается.
zapros:= "%"+LabeledEdit1.Text+"%"; //кавычек не нужно это уже строка
ADOQuery1.SQL.Add("where name like :zapros");
Query1.Params[0].AsString:= zapros;
так правильнекй, либо как показано в [16] без параметра, но с проблемой в одном из случаев (" "), смотря что выбирать за орраничитель строки (аксесс 2 варианта позволяет).
← →
lehich © (2004-08-30 12:11) [19]хмммм... вычтал в JETSQL40.CHM что:
Соответствующие знаки Язык SQL Microsoft Jet ANSI SQL
Любой одиночный знак. ? _ (подчеркивание)
Произвольное количество знаков. * %
подумал вот оно... вот где ошибка... в jet надо использовать не
"%" + LabeledEdit1.Text + "%"
а
"*" + LabeledEdit1.Text + "*"
нифига... результат тотже...((((
← →
Плохиш © (2004-08-30 12:15) [20]
> lehich © (30.08.04 12:11) [19]
Как и сказано уже в [14]:
QuotedStr("%" + LabeledEdit1.Text + "%")
← →
lehich © (2004-08-30 12:15) [21]sniknik © (30.08.04 12:07) [18]
чего-то не понял... какой Query1.Params[0].AsString:= zapros; ???? нет у меня же ADO...
← →
sniknik © (2004-08-30 12:33) [22]> нет у меня же ADO...
ну тогда Parameters, остальное тоже самое
← →
lehich © (2004-08-30 12:38) [23]ADOQuery1.Parameters[0].AsString нет такого...
так... напишу все подробно...
zapros := QuotedStr("%" + LabeledEdit1.Text + "%");
ADOQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("select * from lesobilet");
ADOQuery1.SQL.Add("where name like :zapros");
ADOQuery1.Parameters[0].Name := zapros;
ADOQuery1.Open;
perem := ADOQuery1.FieldByName("name").AsString;
← →
lehich © (2004-08-30 12:41) [24]от ошибки избавились, но всё равно не находит ничего...(((((
← →
Плохиш © (2004-08-30 12:46) [25]
> lehich © (30.08.04 12:41) [24]
Ну ты эта, используй или QuotedStr, или Parameters, а то получается как в том анекдоте...
← →
sniknik © (2004-08-30 12:52) [26]> от ошибки избавились, но всё равно не находит ничего...(((((
естественно, зачем же ты ему имя меняеш, если нужно значение.
и упорно лепиш лишнии кавычки, НЕ НУЖНЫ, в этом случае. ты почитай еще раз когда тебе их советовали применять... для ТОГО случая.
ADODataSet1.Сlose;
ADODataSet1.CommandText:= "select * from lesobilet where name like :zapros";
ADODataSet1.Parameters.ParamByName("zapros").Value:= "%" + LabeledEdit1.Text + "%";
ADODataSet1.Open;
perem := ADODataSet1.FieldByName("name").AsString;
← →
lehich © (2004-08-30 14:32) [27]спасибо большое... извините за причиненное беспокойство...)))
Страницы: 1 вся ветка
Текущий архив: 2004.09.26;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.035 c