Zapytanie SQL bład

0

Form2.ShowModal;
if (Form2.okForm = True) then
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('UPDATE "Baza_ram.db" SET Nazwa = :p0, Rozmiar = :p1, Typ = :p2 '+
'WHERE KOD_Id = :p2');
Query1.Params[0].AsString:= trim(Form2.Edit1.Text);
Query1.Params[1].AsString:= trim(Form2.Edit2.Text);
Query1.Params[2].AsString:= trim(txtID);
Query1.Params[3].AsString:= trim(Form2.ComboBox1.Text);

Query1.ExecSQL;
FormShow(Sender);
end;

Nie jestem zbyt zaawasowanym programistą dlatego proszę o wybaczenie jezeli cos źle tłumaczę lub piszę

Po tym zapytaniu wywala mi bład że nieprawidłowy parametr KOD_id.
nie wiem czy tak moze być skonstruowane zapytanie SQL. Więc prosze o jakie kolwiek rady. Dodam jeszcze że w programie, procedure do dodawanie rekordu do bazy i tam wszystko działa ok problem pojawia się przy edycji

</delphi>

Query1.SQL.Add('UPDATE "Baza_ram.db" SET Nazwa = :p0, Rozmiar = :p1, Typ = :p3 '+
'WHERE KOD_Id = :p2');
W parametrze typ jest ":p3" a nie jak wcześniej napisałem ':p2"
Przepraszam za pomyłkę

0

rozumiem ze p0, p1 ,p2 itd to sa zmienne jezlei tak to blad tkwi w formie zapisu tego, nie mozesz do zapytaniaSQL dodawac zmiennych w ten sposób
mozna to robic na 2 sposoby( przynajmniej ja tak robie)

Query1.SQL.Add('UPDATE "Baza_ram.db" SET Nazwa ='+s+p0+s+', Rozmiar ='+s'+p1+s+', Typ ='+s+p2+s+ 'WHERE KOD_Id ='+s+p2+s);

przy czym s to jest srednik w deklaracjach dajesz
s:=char(39); ( chyba 39)

Zapis troche skomplikowany ale działa bez problemu, przynajmniej u mnie na MySQL, ale z nazwy pliku wnioskuje ze to chyba baza Paradox

a drugi sposób

fragment wyciety zywcem z mojego programu

procedure TKomputery_edit.Button1Click(Sender: TObject);
begin

Data.qrKomputery.RequestLive:= true;
Button1.Enabled:=false;
Button2.Enabled:=true;
Button3.Enabled:=true;
Button4.Enabled:=false;
Button5.Enabled:=false;
DBNAvigator1.BtnClick(nbEdit);
StatusBar1.Panels[0].Text:='Edycja danych komputera.';
DBLookupComboBox1.KeyValue:=Data.qrKomputery.FieldByName('komp_os').AsInteger;
DBLookupComboBox2.KeyValue:=Data.qrKomputery.FieldByName('komp_dzial').AsInteger;
DBLookupComboBox1.ReadOnly:=false;
DBLookupComboBox2.ReadOnly:=false;
end;

procedure TKomputery_edit.Button2Click(Sender: TObject);
begin

Button1.Enabled:=true;
Button2.Enabled:=false;
Button3.Enabled:=false;
Button4.Enabled:=true;
Button5.Enabled:=true;
Data.qrKomputery.FieldByName ('komp_os').AsInteger:=DBLookupComboBox1.KeyValue;
Data.qrKomputery.FieldByName('komp_dzial').AsInteger:=DBLookupComboBox2.KeyValue;
DBNAvigator1.BtnClick(nbPost);
Data.qrKomputery.RequestLive:= false;
DBLookupComboBox1.ReadOnly:=true;
DBLookupComboBox2.ReadOnly:=true;
StatusBar1.Panels[0].Text:='Pomyślnie zakończono edycje danych komputera.';
end;

i tez dziala tylko ze tutaj sie odwołuje bezposrednio do danego pola w bazie i zmieniam mu wartość, zauważ rowniesz ze właczam mozliwosc zapisu (RequestLive) tylko na czas edycji danych,a ty to mozesz zrobic tylko na ten krotki czas update, wiec w jednym zdarzeniu

Może z pewnoscia ktos ma lepsze promysly al e to sa moje wypłodziny i jak na razie wsztsko dziala bez zarzutu

pozdrawiam
genius23

0

Witam
Patrze na ten twoj pierwszy sposób i ni w ząb nie moge pojąć po co a ten
"s+". Tak jak już wcześniej napisałem przy dodawaniu rekordu do bazy jest ok i takie same stosuje parametry nie wiem dlaczego mi to nie działa przy edycji, do zmiennej txtID zapisuje, który rekord ma być edytowany może w tym tkwi
bład tzn że najpierw podaje parametr :p0, p1,:p3 a dopiero pożniej :p2 może w sql tak nie wolno może trzeba parametry podawać po kolei nie wiem

p.s.
baza jest paradox jak to kolega wcześniej trafnie zauważył
a kod pohodzi z książki J.Biernat "ćwiczenia z delphi" troche przerobiony

0

s to jest znak srednika w zmienniej bo jak w zmiennej tekstowej das srednik a tak on jest jako char i w tym momencie masz srednik w zapytaniu.

0

Przede wszystkim to nie średnik tylko apostrof. Poza tym nie ma potrzebu zapychania pamięci kolejnymi zmiennymi kiedy podwójny apostrof znaczy znak apostrofu (czy jakkolwiek po polskiemu powinnio to brzmieć).

0

thx bo nie wiedziałem z tym czudzysłowien
sorki ten s to jest apostrof, powaliło mi sie

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