Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема при записи в базу строки с ковычкой [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(); поможет


Наверх

Титульная страница Поиск, карта сайта Написать письмо