Parametryzajcja zapytania

0

Witam.
Takie krótkie pytanie. Czy mogę zrobić w ten sposób:

select * from tabelka where :pole like :wart;

A później w kodzie:

ADODataSet1.Parameters.ParamByName('pole').Value := 'nazwa_pola';
ADODataSet1.Parameters.ParamByName('wart').Value := 'wartosc_pola';

????

0

Możesz tylko właśnie te parametry też podawaj.

0

A możesz sprecyzować?? Bo jakoś nie mogę załapać kontekstu twojego zdania. :)

0

Przeanalizuj sobie ten przykład. Pisany pod komponenty IBX.

procedure TForm1.Button1Click(Sender: TObject);
begin
   with IBQuery1, SQL do
    begin
     Close;
      Clear;
      Add('SELECT * FROM TABELKA WHERE Nazwisko = :nazw');
     ParamByName('nazw').AsString :=Edit1.Text;
   Open;
 end;
0

Kurcze. No nie działa. Po pierwsze nie mogę wpisać AsString.
Po drugie program jako taki działa, ale zapytanie nie działa.
Pokaże kawałek kodu:

if (Sender as TEdit).Name = 'edtNazwa' then Dane.dsetAdresaci.Parameters.ParamByName('nazwa').Value := 'nazwa';
if (Sender as TEdit).Name = 'edtUlica' then Dane.dsetAdresaci.Parameters.ParamByName('nazwa').Value := 'ulica';
p := (Sender as TEdit).Text + '%';
Dane.dsetAdresaci.Parameters.ParamByName('n').Value := p;
Dane.dsetAdresaci.Active := False;
Dane.dsetAdresaci.Active := True;

Jest to procedurka wpisana do zdarzenia OnChange dwóch TEditów. No i nie działa. Wrrrr.
Oczywiście zapytanie z parametrami jest wpisane bezpośrednio w komponent TADODataSet.

0

Ale co nie działa? Opisz problem. Jakiś błąd wyskakuje? :-)

0

Własnie chodzi o to, że nie ma błędu. Sytuacja wygląda tak:
Zaczynam wpisywać dane do pola, do którego podpięty jest event. I w tym momencie zawartość DBGrida niknie, tak jakby nie było pasującego rekordu. A ja wiem, że rekord pasujący jest i to nie jeden.

A tak wygląda zapytanie:

select nazwa as 'Nazwa adresata',
concat_ws(' ', ulica, nr_domu, IF(nr_mieszkania, concat(' m. ',nr_mieszkania ), ' '), kod, miasto) as 'Adres' from adresaci where :nazwa like :n;

Czyli zarówno nazwa pola w tabeli jak i wartość tego pola jest parametrem.

0

Ja nie wiem czy to jest najlepszy pomysł żeby przez parametr przekazywać nazwę kolumny, bo nie wiem czy nie wyjdzie z tego takie coś

where 'ulica' = 'Słowackiego'

Dla pewności spróbuj sobie zbudować zapytanie dynamicznie - podstawiając odpowiednią rzecz pod nazwę kolumny lub spróbuj to zrobić tylko z jednym parametrem (tym od wartości), a nazwę kolumny ustaw na sztywno. Jeśli zadziała to znaczy że to nie najlepszy pomysł. A może ujęcie tej nazwy kolumny w podwójny cudzysłów pomoże (nie mam jak sprawdzić). Rozwiązać to można na kilka sposobów: np jeśli edit z ulicą ma coś wpisane (eUlica.Text <> ''), to dokładasz do SQL'a ' and ulica=:ulica ' i dajesz ParamByName('ulica').AsString := eUlica.Text i tak dalej.

Aha IMHO to nie jest najlepszy sposób, aby odpalać zapytanie w zdarzeniu OnChange komponentu Edit, niepotrzebnie generujesz ruch w sieci i obciążąsz bazę. Lepiej dać w OnExit jak już, albo w OnKeyDown jeśli Key = VK_ENTER.

0

nie da się nazwy kolumny przekazać jako parametr, ale możesz dynamicznie budować zapytanie przecież

1 użytkowników online, w tym zalogowanych: 0, gości: 1