Кавычки в строке

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Закрыто
Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Кавычки в строке

Сообщение Sanya111 » Вс 23 сен 2012 11:30

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

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Кавычки в строке

Сообщение AndreyZ » Пн 24 сен 2012 10:05

Здравствуйте,

Для вставки в таблицу строки содержащую специальные символы (такие как " ), Вы можете использовать следующий код:

Код: Выделить всё

MyQuery.SQL.Text := 'insert into dept values(1, ''"test"'', ''"test"'')';
MyQuery.Execute;
, тоже самое используя параметры:

Код: Выделить всё

MyQuery.SQL.Text := 'insert into dept values(:deptno, :dname, :loc)';
MyQuery.ParamByName('deptno').AsInteger := 1;
MyQuery.ParamByName('dname').AsString := '"test"';
MyQuery.ParamByName('loc').AsString := '"test"';
MyQuery.Execute;

Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Re: Кавычки в строке

Сообщение Sanya111 » Пн 24 сен 2012 11:20

Извините меня, пожалуйста, я совсем запутался.
Спасибо за подсказку. Проверил insert, все работает, проблема оказывается с селектом. :oops:
#42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test"" AND limit_id="25" AND number_id="2" AND date_id="24146"' at line 1'.
Ошибка при Pr1NameForDB[0,i1]='"test"'

Код: Выделить всё

try
Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id="'+Pr1NameForDB[0,i1]+'"'+
' AND limit_id="'+Pr1NameForDB[1,i1]+'"'+
' AND number_id="'+Pr1NameForDB[2,i1]+'"'+
' AND date_id="'+Pr1NameForDB[3,i1]+'"';
Form1.MyQuery1.Open;
while not Form1.MyQuery1.Eof do
begin
StrokaPrMogForDB:=Form1.MyQuery1.FieldByName('prM_id').AsString;
Form1.MyQuery1.Next;
end;
Form1.MyQuery1.Close;

except
form1.memo3.lines.add(Pr1NameForDB[0,i1]);
end;

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Кавычки в строке

Сообщение AndreyZ » Пн 24 сен 2012 15:20

Вам следует использовать следующий код:

Код: Выделить всё

Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id='''+Pr1NameForDB[0,i1]+''''+
' AND limit_id='''+Pr1NameForDB[1,i1]+''''+
' AND number_id='''+Pr1NameForDB[2,i1]+''''+
' AND date_id='''+Pr1NameForDB[3,i1]+'''';
Form1.MyQuery1.Open;

Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Re: Кавычки в строке

Сообщение Sanya111 » Пн 24 сен 2012 16:37

Спасибо большое, но я к сожалению все равно не могу разобраться.
Если я использую код:

Код: Выделить всё

Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id='''+Pr1NameForDB[0,i1]+''''+
и записываю строку "test", то все работает.
Но если строка будет 'test', то опять будет синтаксическая ошибка.
Для 'test' надо использовать символ " в строке запроса, а для "test" символ '.
Скажите, пожалуйста, существует ли какой-нибудь универсальный способ?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Кавычки в строке

Сообщение AndreyZ » Вт 25 сен 2012 10:52

Да, Вы можете использовать параметры. В этом случае Вы можете использовать строки содержащие как одинарные кавычки, так и двойные. Например:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyQuery1.SQL.Text := 'select * from dept where dname=:dname';
  MyQuery1.ParamByName('dname').AsString := '"test"'; // строка содержит двойные кавычки
  MyQuery1.Open;
  MyQuery1.Close;
  MyQuery1.SQL.Text := 'select * from dept where dname=:dname';
  MyQuery1.ParamByName('dname').AsString := '''test'''; // строка содержит одинарные кавычки
  MyQuery1.Open;
end;

Sanya111
Сообщения: 26
Зарегистрирован: Пн 02 июл 2012 14:07

Re: Кавычки в строке

Сообщение Sanya111 » Вт 25 сен 2012 15:56

Спасибо большое!! Извините меня, я должен был сразу догадаться после первой подсказки, просто самостоятельно бывает трудно разобраться.

Исправил код:
Form1.MyQuery1.SQL.Text:= 'select * from rd where name_id=:dname'+
' AND limit_id='''+Pr1NameForDB[1,i1]+''''+
' AND number_id='''+Pr1NameForDB[2,i1]+''''+
' AND date_id='''+Pr1NameForDB[3,i1]+'''';
Form1.MyQuery1.ParamByName('dname').AsString := Pr1NameForDB[0,i1];
Form1.MyQuery1.Open;

Закрыто