MySQL/Delphi - UPDATE nem frissít

MySQL/Delphi - UPDATE nem frissít
2012-02-03T10:57:14+01:00
2012-02-03T15:17:51+01:00
2022-11-24T14:00:35+01:00
Balagee
Hello! Belefutottam egy érdekes jelenségbe amit nem tudok megmagyarázni hogy mi okozza és remélem, hogy a segítségetekkel sikerülni fog. A szituáció a következő:

Van egy virtuális gépem amin fut MySQL szerver, valamint van 2 program amely ezt használja. Az egyik tökéletesen működik a másodikban viszont egyetlen egy helyen egyetlen egy UPDATE query nem akar lefutni. A szoftverek ugyanazt az adatbázist használják de csak 1 tábla van benne amelyet mindketten használnak. Mindkét szoftver ugyanazzal a login credentials-el lep fel a szerverre és használja ugyanazt az adatbázist de sosem futnak egyszerre. Mindig csak 1 szoftver használja egy konkrét időpontban az adatbázist.
Az SQL kapcsolódást MyDAC komponensekkel van megoldva és eddig tökéletesen működtek minden alkalommal.
Sok Formom van úgyhogy megpróbálom leszűkíteni annyira hogy még értelmes legyen:

procedure TForm8.Button1Click(Sender: TObject); begin Form10 := TForm10.Create(nil); Form10.ShowModal; Form10.Free; Form10 := nil; MyQuery2.SQL.Clear; MyQuery2.SQL.Add('SELECT * FROM gepek WHERE lefoglalva=''1'' OR megrendeles_id=''' + IntToStr(currentindex) + ''' OR megrendeles_id=''-1'' ORDER BY id DESC;'); MyQuery2.Execute; DesignSetup_gepek; end;
A fentebbi kódrészlet működik mert leellenőriztem. PhpMyAdminban manuálisan megváltoztattam az értékeket amit kellet és szépen visszaolvasta az adatokat a query.
Ezen a Formon tobb dbgrid van es mindegyiknek van kulon Myqueryje es datasource-a. Ezek mindegyike a Form1-en lévő TMyConnectionnel kapcsolódnak a szerverre és az adatbázishoz. Mindegyik működik hiba nélkül.

A Form10 létrehozásánál a következő kód fut le:

procedure TForm10.FormCreate(Sender: TObject); begin if conned then Begin MyQuery1.SQL.Clear; MyQuery1.SQL.Add('SELECT * FROM gepek WHERE lefoglalva=''0'' OR megrendeles_id=''' + IntToStr(currentindex) + ''' ORDER BY id DESC;'); MyQuery1.Execute; DesignSetup; id.DataField := 'id'; End; end;
Ez a kód is tökéletesen lefut. A query után a Form10 DBGridjében megjelennek a bejegyzések és kijelölésükkor az id(DBEdit) komponensekbe belekerülnek az adot sor adatai. Ezen a formon található MyQuery is a Form1-en található MyConnectiont használja. A conned változó értékét Timer-rel frissítem másodpercenként hogy mindig tudjam hogy nem szünt e meg a kapcsolat a szerver és a szoftver között. A timer a Form1-en van.
Na és most jön az ahol a hiba van:

procedure TForm10.JvBitBtn1Click(Sender: TObject); begin if conned then Begin MyQuery1.SQL.Clear; MyQuery1.SQL.Add('UPDATE gepek SET lefoglalva=''1'', megrendeles_id=''' + IntToStr(currentindex) + ''' WHERE id=''' + id.Text + ''';'); MyQuery1.Execute; End; Close; end;
Na ez a query nem fut le. A lényeg az lenne hogy a DBGrid-ben megjelöl a felhasználó egy sort és mikor megnyomja az OK gombot akkor azt a bejegyzést kell módosítani(megjelölni használatra). Ellenőriztem a változók értékét. Mielőtt lefutna, showmessage-l kiirattam a currentindex és az id.text értékét is és jó adatok vannak bennük. Konkrét adatokkat behelyettesítve a változók helyére lefuttattam phpmyadmin-ban is és ott lefut a query. Ami eszembe jutott azt kipróbáltam de eddig semmi sem segített. Ha van valami ötletetek, hogy mit ellenőrizzek vagy hogyan haladjak tovább akkor azt szívesen venném. Előre is köszönöm az ötleteket.

U.I.: Ha még szükség lenne valamilyen kódrészletre vagy információra akkor írjatok és válaszolok.
Mutasd a teljes hozzászólást!
Én a paraméterekre gyanakszom.
Próbáld úgy megadni, hogy pl. az id az ..SQL.ADD-ban ":id"
majd MyQuery1.ParamByName('id').AsInteger := StrToInt(id.Text

Példa:
MyQuery1.SQL.Add('UPDATE gepek SET lefoglalva = 1, megrendeles_id= :Mid WHERE id= :id');

MyQuery1.ParamByName('Mid').AsString := IntToStr(currentindex);
MyQuery1.ParamByName('id').AsInteger := StrToInt(id.Text);
Mutasd a teljes hozzászólást!

  • Szerintem hiányzik egy commit.
    Mutasd a teljes hozzászólást!
  • Köszönöm a gyors reagálást. Összesen két darab Commit-ot találtam.
    1. MyConnection1.Commit
    2. MyQuery1.CommitUpdates

    Egyiknél sem lehet paramétert megadni és mindkettőnél error.
    Mutasd a teljes hozzászólást!
  • Én a paraméterekre gyanakszom.
    Próbáld úgy megadni, hogy pl. az id az ..SQL.ADD-ban ":id"
    majd MyQuery1.ParamByName('id').AsInteger := StrToInt(id.Text

    Példa:
    MyQuery1.SQL.Add('UPDATE gepek SET lefoglalva = 1, megrendeles_id= :Mid WHERE id= :id');

    MyQuery1.ParamByName('Mid').AsString := IntToStr(currentindex);
    MyQuery1.ParamByName('id').AsInteger := StrToInt(id.Text);
    Mutasd a teljes hozzászólást!
  • Miért akarsz paramétert megadni? Execute után add ki simán a MyConnection1.Commit-ot
    Mutasd a teljes hozzászólást!
  • Megvan a hiba forrása. Ezt:
    procedure TForm10.JvBitBtn1Click(Sender: TObject); begin if conned then Begin MyQuery1.SQL.Clear; MyQuery1.SQL.Add('UPDATE gepek SET lefoglalva=''1'', megrendeles_id=''' + IntToStr(currentindex) + ''' WHERE id=''' + id.Text + ''';'); MyQuery1.Execute; End; Close; end;
    csak erre kellett módosítani:
    procedure TForm10.JvBitBtn1Click(Sender: TObject); [b]var idx : String;[/b] begin if conned then Begin [b]idx := id.Text;[/b] MyQuery1.SQL.Clear; MyQuery1.SQL.Add('UPDATE gepek SET lefoglalva=''1'', megrendeles_id=''' + IntToStr(currentindex) + ''' WHERE id=''' + [b]idx[/b] + ''';'); MyQuery1.Execute; End; Close; end;
    A hiba abban volt, hogy mikor én kiadtam az SQL.Clear parancsot akkor ugye üríti a DBGrid tartalmát is hiszen azok össze vannak kapcsolva, de ugyanekkor ürítette a DBEdit(id) tartalmát is így az üres stringet adot vissza. Eddig azért nem vettem észre, mert bár én kiirattam a queryt konkrétan az értékekkel futtatás előtt de az még az SQL.Clear parancs felett volt így akkor még a megfelelő érték volt a DBEdit-ben. Na itt volt a kutya elásva. Gondoltam, hogy valami apró kis baki van benne.

    A pontot willi-nek fogom adni mert az ő hozzászólásának köszönhetően jöttem rá. Köszönöm a segítségeteket.
    Mutasd a teljes hozzászólást!
  • Mielőtt lefutna, showmessage-l kiirattam a currentindex és az id.text értékét is és jó adatok vannak bennük.


    vs.

    A hiba abban volt, hogy mikor én kiadtam az SQL.Clear parancsot akkor ugye üríti a DBGrid tartalmát is hiszen azok össze vannak kapcsolva, de ugyanekkor ürítette a DBEdit(id) tartalmát is így az üres stringet adot vissza.


    Mutasd a teljes hozzászólást!
  • Hát igen, mea culpa. Mikor észrevettem majdnem lefejeltem az asztalt idegességemben...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd