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

0
grzegorz_so napisał(a):

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

Różnica jest taka, że wskazuję id - i przez to id może być różne dlatego jest ' ' ale silnik sobie z tym radzi, bo tworzenie usuwanie tabeli czy konkretnych wpisów działa bezproblemowo.

0

Różnica jest taka, że wskazuję id - i przez to id może być różne dlatego jest ' ' ale silnik sobie z tym radzi, bo tworzenie usuwanie tabeli czy konkretnych wpisów działa bezproblemowo.

nie rozumiem co masz na myśli

0

zrobiłem teraz małe doświadczenie, i wiem, że nieistotny jest ten parametr 'e' czy teraz zauważysz 'm7' teraz wpisałem same jedynki jako dane do uaktualnienia, czyli najkrótsze wpisy, więc w informacji debugera, który ma określoną liczbę miejsca na wyświetlanie info w komunikacie - teraz pokazane jest więcej niż ostatnio, błąd leży gdzie indziej niestety... (załącznik 3)

1

tak myślałem że błąd jest gdzie indziej i stąd moja uwaga o poliu ID, ale bez samej bazy danych i pełnego kodu aplikacji chyba niewiele więcej mogę pomóc

0
grzegorz_so napisał(a):

tak myślałem że błąd jest gdzie indziej i stąd moja uwaga o poliu ID, ale bez samej bazy danych i pełnego kodu aplikacji chyba niewiele więcej mogę pomóc

No cóż , dzięki za poświęcony czas, pokombinuję jeszcze, może coś się uda zrobić. Dzięki. Pozdrawiam.

0

życzę powodzenia :))

0

Jaki masz silnik MySQL? Prawdopodobnie cały czas walczysz z niezgodnością typów, ale Zeos Ci o tym raczej nie powie. Zamień wszystkie te form.edit.text na Pchar(form.edit.text) i spróbuj

0

A ja się spytam dość przewrotnie. Dlaczego @zebmcs nie zrobisz tego po ludzku, czyli nie użyjesz bindowania kontrolek bazodanowych do query za pomocą TDataSet, a do update'u nie użyjesz komponentu TZUpdateSQL w którym sobie wygodnie wygenerujesz potrzebne zapytania isert, modify, delete oraz refresh...

0
maniutek20 napisał(a):

Jaki masz silnik MySQL? Prawdopodobnie cały czas walczysz z niezgodnością typów, ale Zeos Ci o tym raczej nie powie. Zamień wszystkie te form.edit.text na Pchar(form.edit.text) i spróbuj

Próbowałem już wcześniej, niestety to nie to, tym bardziej, że reszta funkcji (usuwanie , dodawanie pozycji ) na tych samych zasadach działa prawidłowo.

Mr.YaHooo napisał(a):

A ja się spytam dość przewrotnie. Dlaczego @zebmcs nie zrobisz tego po ludzku, czyli nie użyjesz bindowania kontrolek bazodanowych do query za pomocą TDataSet, a do update'u nie użyjesz komponentu TZUpdateSQL w którym sobie wygodnie wygenerujesz potrzebne zapytania isert, modify, delete oraz refresh...

Na pewno bym tak zrobił, ale to tylko poprawiam, a raczej staram się poprawić już po kimś.... a zbyt wiele tego żeby przepisać całość, zawsze to jakieś nowe doświadczenie :); ale jestem coraz bliżej tego by jednak zacząć od nowa - tak jak ma być....

0
zebmcs napisał(a):

Na pewno bym tak zrobił, ale to tylko poprawiam, a raczej staram się poprawić już po kimś.... a zbyt wiele tego żeby przepisać całość, zawsze to jakieś nowe doświadczenie :); ale jestem coraz bliżej tego by jednak zacząć od nowa - tak jak ma być....

Jeśli to jest coś co będziesz utrzymywał jeszcze jakiś czas to się opłaca a nawet trzeba poprawić. Już samo nazewnictwo Form1, Form7, ZConnection1, ZQuery1, Edit1 pokazuje z jaką kupą g... masz do czynienia. To nie jest doświadczenie, to katorga. Sam widzisz jak walczysz z narzędziem zamiast z niego korzystać po ludzku.

Co do samego błędu możesz spróbować wyświetlić sobie za pomocą ShowMessage treść wykonywanego zapytania i spróbować je wykonać w dowolnym programie do zarządzania bazą MySQL. Może problem tkwi nie w samym zapytaniu, a czymś innym.

0

jestem uparty i znalazłem rozwiązanie, co nie zmienia faktu, iż program nadaje się do całkowitego przepisania... :) ale dla kogoś, kto bedzie miał podobny problem podaję rozwiązanie (jeszcze bez odświeżania, ale kod działa bezbłędnie):

begin
  try
    Form1.ZQuery1.Close;
    Form1.ZQuery1.SQL.Clear;

    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').AsInteger := StrToInt(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;
end;
0

@zebmcs:
fajnie by było gdybyś w dwóch słowach opisał gdzie był problem i na czym polega jego rozwiązanie, bo nikt nie będzie porównywał 50 linii kodu i szukał różnicy pomiędzy złym i dobrym kodem, bo na pierwszy rzut oka oba są niemal identyczne

0

Ogólnie zacząłem od początku i problem polegał na ilości apostrof - przez co program podawał nieprawidłowy kod do bazy i nie mógł przez to znaleźć wykazywanego w błędzie parametru 'a' oraz zamiast REPLACE zastosowałem UPDATE.

0
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');

to Twoje "błędne" :) query z Twoich poprzednich postów ale nie widzę w nim nadmiarowych apostrofów
myślę że problem nie był w apostrofach
i query jest jak najbardziej prawidłowe

0

Zacząłem od początku, nie od ostatniej modyfikacji. Teraz chyba widać różnicę, a początkowe ustawienie ID (...SET id=:i,...) jest niestety potrzebne :)

//Początkowa wersja niedziałąjącego kodu:
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');

//Rozwiązanie prawidłowe:
Form1.ZQuery1.SQL.Add('UPDATE magazyn SET id = :i ,m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h where id= :i');//


//ostatnio zastosowany, nieprawidłowy kod:
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
//Rozwiązanie prawidłowe:
Form1.ZQuery1.SQL.Add('UPDATE magazyn SET id = :i ,m1= :a, m2= :b, m3= :c, m4= :d, m5= :e, m6= :f, m7= :g, m8= :h where id= :i');//
 
//ostatnio zastosowany, nieprawidłowy kod:
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');

ale te dwie komendy SQL właściwie niczym się nie różnią , bo jedyna różnica, SET id = :i przy warunku where id= :i to masło maślane

0

no cóż, widać jednak nie do końca....

0
Smutny Mleczarz napisał(a):

no cóż, widać jednak nie do końca....

więc gdzie jest ta różnica ???

1

ale te dwie komendy SQL właściwie niczym się nie różnią , bo jedyna różnica, SET id = :i przy warunku where id= :i to masło maślane

no cóż, widać jednak nie do końca....

więc gdzie jest ta różnica ???

Jak się okazuje, akurat w tym przypadku to nie jest masło maślane, ponieważ (w tym przypadku) ilość kolumn =9 (łącznie z id) więc i zapytanie musi być dla 9 kolumn, nieistotne jest to czy warunkiem jest jedna z kolumn, tak jak ma to tutaj miejsce. Podobna sytuacja jest też akurat w tym przypadku z samym "id" - dla delphi jest to integer ale dla bazy danych typu MySql jest to nieistotne (tutaj jest string). Procedura jak i kod jak najbardziej poprawny, chociaż można to oczywiście zrobić na wiele innych sposobów.

0

@pijany jeleń
W tym przypadku to JEST masło maślane.
query:

update table  set id=:i where id=:i 

zawsze będzie masłem maślanym

ale dla bazy danych typu MySql jest to nieistotne (tutaj jest string).

Pole ID w tabeli jest typu INT i taki sam powinien być typ parametru. To że silnik bazy dla pola ID robi rzutowanie typu 'string' na 'int' to fajnie, ale co będzie jeśli 'string' nie będzie znakową reprezentacją wartości typu INT ? odnoszę wrażenie że walczysz z problemem który sam stworzyłeś nie dbając o zgodność typów.

0

@grzegorz_so Nie wiem w czym masz jeszcze problem, jakiś gość wyjaśnił w jasny dosyć sposób, że W TYM PRZYPADKU będzie to działać, ponadto dodam, że bez tego Twojego "masła maślanego" występuje błąd, ten co był... a tak działa bez zarzutu. Temat jak dla mnie rozwiązany, a jeśli chcesz to proszę bardzo, zrób bazę danych opartą na tym kodzie i dochodź sobie prawdy z tym "masłem maślanym". Co do ID się zgadzam, że jest INT (jak zauważyłeś tutaj nie jest pobierany bezpośrednio z bazy MySql), ale skoro String też działa (bynajmniej u mnie) to też nie widzę w tym problemu. Pozdrawiam. (Poprawiłem nawet ten działający kod i zamieniłem string na integer, w obydwu przypadkach AKURAT TEN kod działa prawidłowo i bez błędów.).

0

pisałeś o problemie, podałeś query sprawiające problem i teraz niemal to samo query publikujesz jako rozwiązanie

// niby błedne 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');

// niby prawidłowe query

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

różnica jest taka że w drugim dodatkowo masz SET id = :i co w żadnym razie nie wpływa na składniową prawidłowość "query "

0

Nie tylko publikuję to rozwiązanie ale je zastosowałem. Nie wiem jak Ci to wyjaśnić , ale właśnie taka mała różnica powoduje, że kod działa prawidłowo.

0

czyli problem nie jest rozwiązany bo wciąż nie wiesz co było faktyczną przyczyną błędu w aplikacji .
Wyjaśnienie typu, kod " A" nie działa mi a kod "B" już działa, to po pierwsze nie wyjaśnia problemu i przyczyny błędu (wyjątku) a po drugie pokazuje że nie wiesz co naprawdę robi Twój kod. Takie podejście to takie macanie na oślep, coś tam zmienię w kodzie i może zadziała. Nie zbudujesz dobrej aplikacji bez wyjaśnienia przyczyny wyjątku

0

@grzegorz_so Nie dawało mi to spokoju to "Masło maślane" i doszedłem po analizie do wniosku, że po prostu brakowało samego "SET" a "id = :i," można po prostu wyciąć. :) Jednak miałeś rację. Poprawny kod już "poprawiłem" :) . Nie mam pojęcia czemu kod nie działał wcześniej. Pozdrawiam.

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