Subject | Re: [firebird-support] locate O'Connor |
---|---|
Author | Sam Hunt |
Post date | 2005-09-28T00:52:21Z |
Helen Borrie wrote:
Thx again and again and again...
Sam
> At 11:51 PM 27/09/2005 +0000, you wrote:Wow! You all really had fun with this one and gave me a lot to consider.
> >FB 1.5.2 B:4731
> >
> >sql.strings[2]:='where
> >upper(Last_Name)='+#39+uppercase(dbeditLastName.Text)+#39+' ';
> >
> >errors when dbeditLastName.Text contains an apostrophe (single quote)
> >in the name, as in O'Connor. The query reports that "Connor" is an
> >unknown token.
>
> Apostrophes have to be "doubled", just as in Delphi itself. Since you
> are using Delphi, just use the QuotedStr() function:
>
> sql.strings[2]:='where upper(Last_Name)='
> + QuotedStr(uppercase(dbeditLastName.Text));
>
> Actually (off-topic here) better than that is
>
> with MyDataset do
> begin
> SQL.Add('SELECT...whatever');
> SQL.('where upper(Last_name) = :UpperLastName');
> Prepare;
> ParamByName('UpperLastName').AsString :=
>
> QuotedStr(uppercase(OtherDataset.FieldByName('Last_Name').AsString));
> Open;
> end;
>
> i.e.
> 1. Use params
> 2. Use the proper methods with TStrings
> 3. Don't read parameter values from the Text property of data-aware
> controls: read the dataset itself
> and (even better)
> 4. If MyDataset is a design-time object that is going to be re-used
> over and over, apply the parameterised SQL strings to the SQL property
> in the IDE. This avoids constantly re-assigning the SQL that causes
> expensive unpreparing and repreparing. Merely slotting in fresh
> values for params doesn't require the statement to be re-prepared.
> "Prepare once, execute often" saves network traffic and processing
> cycles. It's easier to maintain, as well.
>
> with MyDataset do
> begin
> if not Prepared then Prepare;
> ParamByName('UpperLastName').AsString :=
>
> QuotedStr(uppercase(OtherDataset.FieldByName('Last_Name').AsString));
> Open;
> end;
>
> ./hb
Thx again and again and again...
Sam