![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при записи в базу строки с ковычкой [D7, Paradox]
Edelweis © (2005-09-18 12:55:00)Вот такой кусок кода:
s:= 'insert into Base.db(CID, str) values('+ IntToStr(id)+',"'+str+'")';
MQuery.SQL.Add(s);
MQuery.ExecSQL;
Если в переменной str оказывается символ ' - то есть одинарная кавычка, то команда не выполняется и проискодит косяк. При использовании параметров - ограничение на 255 символов. Как избежать этого?
Плохиш (2005-09-20 12:31:00) [1]
> ANB © (20.09.05 12:27) [14]
>
> > Плохиш © (20.09.05 11:55) [13]
> Точно, ест. Но chr(0)полюбому все сломает
И что, при использовании параметров, строку не обрежет?
ANB (2005-09-20 12:27:00) [2]
> Плохиш © (20.09.05 11:55) [13]
Точно, ест. Но chr(0) полюбому все сломает. Короче, нарывался я на разные бяки при таком подходе.
Плохиш (2005-09-20 11:55:00) [3]
> ANB © (19.09.05 14:00) [10]
> Есть еще много нехороших символов, которые сломают SQL строку.
> Например CRLF.
Не надо обманывать.
ANB (2005-09-19 14:15:00) [4]
> Tonich © (19.09.05 14:04) [11]
Собственно, QuotedStr() тут ни при чем. А вот связка для решения сабжа QuotedStr() + SQL - затычка, в которой еще полно дырок. Числа в строке SQL для LocalSQL еще допустимы, для серверов - уже не очень. Кстати, давно использую отработанную технологию отладки SQL + Delphi : прежде чем запихать запрос в клиента - отлаживаешь его на всех режимах с параметрами в приложении для отладки SQL (QA, PL/SQL Developer, TOAD), затем обрамляешь кавычками и засовываешь в модуль. На 90% ошибок не будет. А вот пытаться отлаживать вот такой код со склейками - сущий геморрой.
Tonich (2005-09-19 14:04:00) [5]
> ANB © (19.09.05 14:00) [10]
да бог с ними с теми символами, QuotedStr() то тут причем?
ANB (2005-09-19 14:00:00) [6]
> Плохиш © (19.09.05 13:18) [7]
> Tonich © (19.09.05 13:40) [8]
Есть еще много нехороших символов, которые сломают SQL строку. Например CRLF. Все предусматривать - во первых замучаешься, во вторых в строку сядут не те данные, которые ввел юзер (или достаны из другой таблицы), что не очень кошерно.
Val (2005-09-19 13:52:00) [7]>[4] AlexWlad © (18.09.05 14:11)
Делфи поддерживает сишное форматирование?
Tonich (2005-09-19 13:40:00) [8]
> ANB © (19.09.05 12:59) [6]
да мне тоже интересно на какие?
Плохиш (2005-09-19 13:18:00) [9]
> ANB © (19.09.05 12:59) [6]
> SQL + QuotedStr() -> Топка.
> Наступишь на другие грабли.
Можно подробнее про грабли?
ANB (2005-09-19 12:59:00) [10]
> Plague © (19.09.05 12:54) [5]
> QuotedStr() Rulezzz!
SQL + QuotedStr() -> Топка.
Наступишь на другие грабли. Пользуйся параметрами.
Plague (2005-09-19 12:54:00) [11]QuotedStr() Rulezzz!
AlexWlad (2005-09-18 14:11:00) [12]Перед кавычкой вставь слэш и все ОК
Os (2005-09-18 13:35:00) [13]Для строк лучше использовать параметры и no problem
s:= 'insert into Base.db(CID, str) values('+ IntToStr(id)+',:myStr)';
MQuery.SQL.Add(s);
MQuery.paramByName('myStr').asString:= str;
MQuery.ExecSQL;
или
s:= 'insert into Base.db(CID, str) values(:muId,:myStr)';
MQuery.SQL.Add(s);
MQuery.Params[0].Value:= id;
MQuery.Params[1].value:= str;
MQuery.ExecSQL;
Дело вкуса, но второй вариант быстрее
Anatoly Podgoretsky (2005-09-18 13:23:00) [14]А разве Парадокс поддерживает текстовые поля свыше 255 символов?
_dimka (2005-09-18 12:59:00) [15]не уверен но возможно QuotedStr(); поможет