Zamiana (Edycja) kilku wpisów w bazie MySQL z poziomu Delphi7

0

Witajcie.
Chciałbym zrobić taką opcję - Edycja w bazie danych aby móc zastępować kilka wpisów w bazie danych.Do połączenia używam "Zeosa". Edycja/zamiana zawartości pól ma się odbywać poprzez okna "..Edit.Text". m1, m2, m3 itd. to nazwy utworzonych kolumn w tabeli a magazyn to nazwa tabeli. Kod się uruchamia ale występuje taki błąd: "Project1.exe raised exception class EDatabaseError with message 'ZQuery1: Parameter 'a' not found'. Use Step or Run to Continue. Process Stoped...." Nie mogę sobie z tym poradzić. Zależy mi by już przypisane ID zostało bez zmian. (bo usuwanie i tworzenie nowych wpisów działa super ale ID się zmienia), Na razie mam coś takiego:

try
    if Form1.ZConnection1.Connected then
       Form1.ZConnection1.Connected := False
    else Form1.ZConnection1.Connected := True;

    Form1.ZQuery1.Close;
    Form1.ZQuery1.SQL.Add('REPLACE magazyn SET ''id= :i, m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h'' where id= :i');
        Form1.ZQuery1.ParamByName('i').AsString := Form7.StatusBar1.Panels[1].Text;
        Form1.ZQuery1.ParamByName('a').AsString := Form7.Edit1.Text;
        Form1.ZQuery1.ParamByName('b').AsString := Form7.Edit2.Text;
        Form1.ZQuery1.ParamByName('c').AsString := Form7.Edit3.Text;
        Form1.ZQuery1.ParamByName('d').AsString := Form7.Edit4.Text;
        Form1.ZQuery1.ParamByName('e').AsString := Form7.Edit5.Text;
        Form1.ZQuery1.ParamByName('f').AsString := Form7.Edit6.Text;
        Form1.ZQuery1.ParamByName('g').AsString := Form7.Edit7.Text;
        Form1.ZQuery1.ParamByName('h').AsString := Form7.Edit8.Text;
    Form1.ZQuery1.ExecSQL;
    Form1.ZQuery1.Close;
    Form1.ZQuery1.SQL.Clear;
       Form7.Edit1.Clear;
       Form7.Edit2.Clear;
       Form7.Edit3.Clear;
       Form7.Edit4.Clear;
       Form7.Edit5.Clear;
       Form7.Edit6.Clear;
       Form7.Edit7.Clear;
       Form7.Edit8.Clear;

 except
     Form1.StatusBar1.Panels[1].Text := 'Wystąpił błąd podczas edycji wybranej pozycji.';
 end;
   Form7.Close;
end;

Może wie ktoś gdzie jest błąd, albo ma pomysł jak rozwiązać taki problem z edycją pól w bazie danych?. Pozdrawiam.

0

Ale po co zgadywać gdzie jest błąd ? wystarczyło by zrobić prawidłową obsługę wyjątku, bo Twoja maskuje komunikat o wyjątku

except
  on e: exception do
    Form1.StatusBar1.Panels[1].Text := 'Wystąpił błąd podczas edycji wybranej pozycji:' + e.message;
end;

już widzę
masz nadmiarowe apostrofy w query

Form1.ZQuery1.SQL.Add('REPLACE magazyn SET id= :i, m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h  where id= :i');

BTW, bezsensowne jest podstawienie set id= :i przy warunku id=:i

0

jak wygląda Query i jaki masz komunikat o błędzie ?

0

Błąd po poprawkach wygląda tak jak na załączniku (nie chce już mi się tego przepisywać) :)

0

pojawia się komunikat z Delphi, bo domyślnie debugger przechwytuje wszystkie wyjątki, również te które powinny być w całości obsłużone w kodzie aplikacji. Można to wyłączyć w opcjach kompilatora dodając do listy klasę wyjątków nie obsługiwanych przez debugger

napisz jak wygląda query bo chyba masz błąd w składni

0
grzegorz_so napisał(a):

napisz jak wygląda query bo chyba masz błąd w składni

Niebardzo wiem co teraz Tobie napisać, query masz w pierwszym poście

0

pytam o query !!! komendę w SQL, czyli to co wysyłasz do bazy

Form1.ZQuery1.SQL.ADD('coś tam coś tam .... ');

???
co masz tym coś tam ????
BTW. w komunikacie o błędzie masz "Replace" które próbujesz użyć jak "update"

0

No to napisałem wyżej :

Form1.ZQuery1.SQL.ADD('REPLACE magazyn m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h  where id= :i');
0

jak wcześniej napisałem , nie replace ale update

Form1.ZQuery1.SQL.ADD('update  magazyn set m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h  where id= :i');
0

Tak, zgadza się, ja poprawiłem na ten wpis, po którym występuje ten drugi błąd, Tak czy inaczej wpisując UPDATE zamiast REPLACE błąd pozostaje identyczny.

0

komunikat o błędzie nie może być identyczny, bo poprzednio w komunikacie o błędzie było replace, a jeśli teraz w query nie masz Replace więc i w komunikacie o błędzie nie może być replace

0
grzegorz_so napisał(a):

nie może być identyczny bo teraz w query nie masz Replace więc i w komunikacie o błędzie nie może być

Oczywiście, w błędzie zamiast Replace pojawia się Update, ale reszta bez zmian. (załącznik)

0

różnic w komunikacie o błędzie jest więcej niż tylko zmiana REPLACE na UPDATE, przyjrzyj się dobrze
podaj aktualną postać query

0
grzegorz_so napisał(a):

nie bo zmian w komunikacie o błędzie jest więcej niż tylko zmiana REPLACE na UPDATE, przyjrzyj się dobrze
podaj aktualną postać query

No faktycznie... nieco się różni, ale chyba zbyt długo nad tym siedziałem, bo już niedowidzę :) nie zwracaj na odczytaną zawartość pól, bo akurat kliknęło mi się na drugim przykłaowym wpisie "o pomarańczach" a poprzedni był "o cebuli" :)
aktualna postać query:

Form1.ZQuery1.SQL.ADD('update  magazyn set m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h  where id= :i');
0

czyli tutaj masz problem

 m5= :e,

jaką wartość podstawiasz pod parametr "e" ? i jaki jest typ pola "m5" w tabeli magazyn ?

BTW, masz fatalne nazewnictwo pól w tabeli, m1,m2,m..... raz że nic nie mówi o treści pola, dwa sprzyja pospolitym błędom literowym typu że np. zamiast "m4" użyjesz w query "m5"

0
grzegorz_so napisał(a):

czyli tutaj masz problem

 m5= :e,

jaką wartość podstawiasz pod parametr "e" ? i jaki jest typ pola "m5" w tabeli magazyn ?

pod parametr e - podstawiam wpis z pola Form7.Edit5.Text - zresztą wg poniższego wzoru:

        Form1.ZQuery1.ParamByName('i').AsString := Form7.StatusBar1.Panels[1].Text; //wartość ID
        Form1.ZQuery1.ParamByName('a').AsString := Form7.Edit1.Text;             //wartość kolumny m1
        Form1.ZQuery1.ParamByName('b').AsString := Form7.Edit2.Text;             //wartość kolumny m2
        Form1.ZQuery1.ParamByName('c').AsString := Form7.Edit3.Text;             // wartość kolumny m3 ... itd.
        Form1.ZQuery1.ParamByName('d').AsString := Form7.Edit4.Text;
        Form1.ZQuery1.ParamByName('e').AsString := Form7.Edit5.Text;
        Form1.ZQuery1.ParamByName('f').AsString := Form7.Edit6.Text;
        Form1.ZQuery1.ParamByName('g').AsString := Form7.Edit7.Text;
        Form1.ZQuery1.ParamByName('h').AsString := Form7.Edit8.Text;
0

nie dogadamy się, pokaż jaka jest struktura tabeli "magazyn"
być może próbujesz podstawić w polu "m5" wartość która nie jest zgodna z typem pola
nie jestem ekspertem od MySql i ZeosLib, to trochę nie moja bajka, ale coś takiego przychodzi mi na myśl

0
grzegorz_so napisał(a):

nie dogadamy się, pokaż jaka jest struktura tabeli "magazyn"

tworzę tabelę w ten sposób:

(...)
Form1.ZQuery1.SQL.Add ('CREATE TABLE magazyn (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, m1 CHAR(50), m2 CHAR(50), m3 CHAR(50), m4 CHAR(50), m5 CHAR(50), m6 CHAR(50), m7 CHAR(50), m8 CHAR(50));');
   Form1.ZQuery1.ExecSQL;
   Form1.ZQuery1.Close;
(...)
0

to jeszcze raz wklej cały i aktualny kod powodujący błąd

0
grzegorz_so napisał(a):

to jeszcze raz wklej cały i aktualny kod powodujący błąd

oto całość (błąd występuje dopiero po naciśnieciu bitbtn1):

procedure TForm7.BitBtn1Click(Sender: TObject);

begin

  try
   // if Form1.ZConnection1.Connected then
   //    Form1.ZConnection1.Connected := False
   // else Form1.ZConnection1.Connected := True;

    Form1.ZQuery1.Close;
    Form1.ZQuery1.SQL.ADD('update magazyn set m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h  where id= :i');
        Form1.ZQuery1.ParamByName('i').AsString := Form7.StatusBar1.Panels[1].Text;
        Form1.ZQuery1.ParamByName('a').AsString := Form7.Edit1.Text;
        Form1.ZQuery1.ParamByName('b').AsString := Form7.Edit2.Text;
        Form1.ZQuery1.ParamByName('c').AsString := Form7.Edit3.Text;
        Form1.ZQuery1.ParamByName('d').AsString := Form7.Edit4.Text;
        Form1.ZQuery1.ParamByName('e').AsString := Form7.Edit5.Text;
        Form1.ZQuery1.ParamByName('f').AsString := Form7.Edit6.Text;
        Form1.ZQuery1.ParamByName('g').AsString := Form7.Edit7.Text;
        Form1.ZQuery1.ParamByName('h').AsString := Form7.Edit8.Text;
    Form1.ZQuery1.ExecSQL;
    Form1.ZQuery1.Close;
    Form1.ZQuery1.SQL.Clear;
       Form7.Edit1.Clear;
       Form7.Edit2.Clear;
       Form7.Edit3.Clear;
       Form7.Edit4.Clear;
       Form7.Edit5.Clear;
       Form7.Edit6.Clear;
       Form7.Edit7.Clear;
       Form7.Edit8.Clear;

  except
    on e: exception do
    Form1.StatusBar1.Panels[1].Text := 'Wystąpił błąd podczas edycji wybranej pozycji:' + e.message;
  end;
   Form7.Close;
end;
0

a co robi ten fragment kodu ??

if Form1.ZConnection1.Connected then
       Form1.ZConnection1.Connected := False
    else Form1.ZConnection1.Connected := True;

jeśli podłączenie do bazy jest otwarte to zamknij a jeśli zamknięte to otwórz ?? :))

0

tak, bo zeos ma to do siebie, że czasem traci połączenie.... ale to nie przeszkadza akurat w niczym.

0

to nie prościej zrobić coś takiego

Form1.ZConnection1.Connected := False

bo wykonanie Query i tak otworzy połączenie

0

zeos ma to do siebie, że czasem traci połączenie.... ale to nie przeszkadza akurat w niczym. Akurat z połączeniem problemów nie mam. :)

0

błąd o którym piszesz pojawia się niezależnie to tego jaką wartość podstawiasz pod parametr "e" ?

0
grzegorz_so napisał(a):

błąd o którym piszesz pojawia się niezależnie to tego jaką wartość podstawiasz pod parametr "e" ?

niezależnie od tego co wpiszę, ( to raczej nie jest błąd parametru "e" ) ale jestem tak zdesperowany przez ten błąd że jestem gotów już sprawdzić wszystko.... :)

wcześniej nie mógł znaleźć parametru 'a' (to ta pierwsza moja wersja), a teraz po prostu jest gdzieś w lini query błąd składni...

0

to na początek uporządkuj typy parametrów i pól w bazie
nie podoba mi się to podstawienie:

 Form1.ZQuery1.ParamByName('i').AsString := Form7.StatusBar1.Panels[1].Text;

w warunku masz id=:i , "id" jest typu INT a Ty pod parametr "I" podstawiasz string
jeśli już to tak bym to widział

Form1.ZQuery1.ParamByName('i').AsInteger  := strtoint(Form7.StatusBar1.Panels[1].Text);

oczywiście musisz dopilnować aby Form7.StatusBar1.Panels[1].Text było prawidłową tekstową reprezentacją wartości typu Integer

0
grzegorz_so napisał(a):

to na początek uporządkuj typy parametrów i pól w bazie
nie podoba mi się to podstawienie:

 Form1.ZQuery1.ParamByName('i').AsString := Form7.StatusBar1.Panels[1].Text;

w warunku masz id=:i , "id" jest typu INT a Ty pod parametr "I" podstawiasz string

ParamByName('i').AsString := zamienia Integer na string - a string musi być podstawiony jeśli ma być widoczny jako text,
ParamByName('i').AsInteger := program nie odpali, będzie na 100% - Incompatible types: 'Integer' and 'String'
Form1.ZQuery1.ParamByName('i').AsInteger := StrToInt(Form7.StatusBar1.Panels[1].Text); - program odpala, ale po kliknięciu w bitbtn1 występuje ten sam błąd syntax (składni)...

0

zgodność typów to podstawa, w bazie ID jest typu INT, Ty robisz podstawienie where ID='60' a powinno być where id=60
być może silnik bazy poradzi sobie z czymś takim ale nie jest to prawidłowy zapis

0

możesz jeszcze raz podać cały komunikat o błędzie

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