Dane niewidoczne po wywołaniu INSERT

0

Czesc,

Nie wiem o co chodzi ale probuje dodac dane do tablicy i nie moge o dziwo kiedy wywolam funkcje CREATE TABLE na tablicy ktora juz istnieje i wyskoczy mi blad dane pokazuja sie na MYSQL stronie ....

SQLquery1.SQL.Text:= 'INSERT INTO verlichting (ID,Online) VALUES ( 0, 0)';
    ShowMessage('Data Inserted');
      SQLquery1.ExecSQL;
  MySQLConnection1.HostName := '127.0.0.1'; //Database website
    MySQLConnection1.Port:=3306;
    MySQLConnection1.UserName := 'root';          //Gebruikersnaam invoeren!!!
    MySQLConnection1.Password := '';        //Wachtwoord invoeren!!!
    MySQLConnection1.Transaction := SQLTransaction1;//Connectie maken om transacties over te brengen
    MySQLConnection1.DatabaseName := 'schakelaar'; //selecteer database 'Prog3'
    MySQLConnection1.Open; //Open connectie + Bijbehorende datbase

    SQLTransaction1.Active:=TRUE;

Dodam ze dane wydaja sie byc widoczne dla aplikacji bo gdy wywowal GET from TABLE dane pokazuja sie , ale nie zapisuja sie w mysql.

0

W Delphi od jakiegoś czasu nie siedzę, ale:

  1. ExecSQL - to masz na końcu, tak?
  2. wyłącz transakcje i sprawdź czy działa zgodnie z oczekiwaniem
  3. przeczytaj: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Caching_Updates_(FireDAC)
0

@vpiotr wedlug jakich oczekiwan ? :> co sie stanie po wylaczeniu transakcji. cahcing updates nie mamy uzywac mamy skorzystac czysto z biblioteki sqldb , wiec ma to dzialac po prostu po wywolaniu execSQL ... a nie dziala

klikajac na sqltransaction1 active - true wyswietla mi sie blad failed to select databse. Acces denief for user @lcoalhost to database schakelaar moze tu jest trop hmm

matko jedyna ... dziala sql1transaction element mial blad w sobie, zdarzenie nie wywowywalo funkcji commit .. ja pidole nigdy wiecej delphi :p

NIE DZIALA ... dane sa wpisane dopiero po wyjsciu z aplikacji wtf

UPDATE udalo mi sie to troche na lewo rozwiazac , kiedy wywolam funkcje MySqlConnection1.Close(True); wtedy dopiero informacje sa zapisywane na stronie mysql, moze mi ktos powiedziec dlaczego dopiero po zamknieciu polaczeniu tak sie dzieje ? Czy mzoe jest jakas funkcja ktora wymusza commit ?

Temat do zamkniecia ... wystarczy bylo wywolac funkcje commit... tak jak myslalem delphi tego nie robi za nas , tylko wysyla zapytanie do MYSQL daltego bylo widoczne dla aplikacji ale permametnie zapisuje dopiero po wywolaniu funkcji commit.

1

Twoim rozwiązaniem będzie jawne wywołanie Commit.
Jak otwierasz transakcję to trzeba by ją kiesyś zamknąć lub odwołać.

0

Dokładnie tak, jak pisze poprzednik. Transakcje działają w taki sposób, że:

  1. Rozpoczynasz transakcję ręcznie.
  2. Robisz zmiany w bazie danych.
    W tym momencie żaden magiczny mechanizm w ŻADNYM języku nie commitnie Ci transakcji, wtedy kiedy chcesz. Bo to Ty jesteś za nią odpowiedzialny i Ty masz powiedzieć, co się ma z transakcją stać.
  3. Po zrobieniu odpowiednich zmian w bazie, musisz transakcję albo wycofać(rollback), albo zatwierdzić(commit). Jeśli transakcję wycofasz, wszystkie zmiany, które wprowadzisz zostaną wycofane (nie zostaną zaakceptowane), czyli baza wróci do stanu sprzed transakcji. Jeśli transakcję zaakceptujesz, dopiero wtedy baza danych zostanie zaktualizowana. W Twoim przypadku widocznie jest tak, że przy zamykaniu połączenia z bazą, jeśli jest otwarta transakcja, zostaje ona zatwierdzona.

Poczytaj o transakcjach w bazach danych.

Z takich ciekawostek, to zapytanie INSERT, czy UPDATE same w sobie są niejawną transakcją. Tzn., że jeśli wykonujesz jeden INSERT albo jeden UPDATE to nie musisz tworzyć dla nich transakcji (bo same sobie to robią wewnętrznie). Ale jeśli masz już więcej takich zapytań, to wtedy warto dla takiej grupy utworzyć transakcję, bo:

  1. Zachowana zostanie spójność danych "w razie czego".
  2. Taka grupa z transakcją utworzoną przez Ciebie wykona się szybciej niż bez transakcji.

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