[delphi] Problem z sql i ADOQuery

0

Witam

Mam taki oto kod:

//w formie logowanie 

function Tlogowanie.query(zap:string):TADOQuery;
begin
zapytanie1.Close;
zapytanie1.SQL.Clear;
zapytanie1.SQL.Add(zap);
zapytanie1.Open;
zapytanie1.First;
query:=zapytanie1;
end;

//W pliku glownym

var zap:TADOQuery;
i:integer;

begin
zap := logowanie.query('SELECT DISTINCT(typ) FROM samochody');
if (zap.Fields.Fields[0].Value <> null) then
  begin
  i:=0;
  while not zap.Eof do
    begin
    combobox1.Items.Add(zap.Fields.Fields[i].Value);
    i:=i+1;
    zap.Next;
    end;
  end;
combobox1.Items.Add('Inne');
zap := logowanie.query('SELECT DISTINCT(kolor) FROM samochody');
showmessage(zap.Fields.Fields[0].value);
if (zap.Fields.Fields[0].Value <> null) then
  begin
  i:=0;
  while not zap.Eof do
    begin
    combobox4.Items.Add(zap.Fields.Fields[i].Value);
    i:=i+1;
    zap.Next;
    end;
  end;
combobox4.Items.Add('Inne');
end;

I co ciekawe w combobox1 i combobox4 otrzymuje dokładnie te same wartości tak jakby z pierwszego zapytania mimo że w bazie danych kolumny kolor i typ sa zupełnie różne.
Wie ktoś czemu tak się dzieje i jak temu zaradzić?
Co najciekawsze mam analogiczną funkcję query2 która korzysta z osobnej kontrolki typu ADOQuery i nawet jak stworze dodatkową zmienną zap2 (typu ADOQuery) i przypisze jej wynik funkcji query2 to w combobox4 wstawia się ta sama wartość (w pętli oczywiście korzystam już ze zmiennej zap2).

0

Niepotrzebnie wprowadzasz sobie dodatkową funkcje do zapytania, jakby nie dało się tego zrobić normalnie..

var sql:TADOQuery;
    dane:string;
begin
try
sql:=TADOQuery.Create(self);
sql.Connection:=Connection;
sql.SQL.Add('SELECT ... FROM ... WHERE ...');
sql.Open;
while not sql.Eof do begin
 dane:=sql.FieldByName('kolumna').AsString;
 //zrob cos z dane
sql.Next;
end;
sql.Close;
finally
sql.Free;
end;
end;
0

Dobra to teraz już zupełnie nie wiem czemu się tak dzieje. Efekt jest dokładnie taki sam przy tym kodzie:

zap := TADOQuery.Create(self);
zap.Connection:=logowanie.Polaczenie;
zap.SQL.Add('SELECT DISTINCT(typ) FROM samochody');
zap.Open;
if (zap.Fields.Fields[0].Value <> null) then
  begin
  while not zap.Eof do
    begin
    combobox1.Items.Add(zap.Fields.Fields[0].Value);
    zap.Next;
    end;
  end;
zap.Close;
zap.Free;
combobox1.Items.Add('Inne');
zap := TADOQuery.Create(self);
zap.Connection:=logowanie.Polaczenie;
zap.SQL.Add('SELECT DISTINCT(kolor) FROM samochody');
zap.Open;
if (zap.Fields.Fields[0].Value <> null) then
  begin
  while not zap.Eof do
    begin
    combobox4.Items.Add(zap.Fields.Fields[0].Value);
    zap.Next;
    end;
  end;
zap.Close;
zap.Free;
combobox4.Items.Add('Inne');
0

A ja mam takie pytanie jeśli można się wtrącić.

ADOQuery.SQL.Text:='INSERT .... ';
ADOQuery.ExecuteDirect;

Czy da się od razu zwrócić pod jakim ID to zostało napisane ? Czy pozostaje dodatkowy select..

0

Okazało się ze jednak po którejś zmianie wkradł się błąd do bazy a jej zawartości oczywiście nie odświeżyłem. Tak więc problemu nie ma. Ale dzięki za zoptymalizowanie kodu :)

0

Co do tego ID to musisz i

 INSERT ....... VALUES() RETURNING ID

wprowadzic takie zapytanie. Zapytanie zwróci ci wartosc ID.

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