Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije

[es] :: C/C++ programiranje :: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije

[ Pregleda: 2413 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije24.01.2008. u 23:00 - pre 197 meseci
Scenario je sledeci:

imam 2 forme:

1. iscitava podatke iz baze preko DataModule->DataSet-a u DBGrid; u DBGrid-u selektujem celije i prebacim vrednosti u StringGrid 2. forme (radi se o parent-child odnosu izmedju formi). Ovo mi obavlja IBTransaction1;

2. forma, pomocu IBTransaction2, radi insert u bazu na osnovu podataka pokupljenih iz prethodno napunjenog StringGrid-a. Upiti se pravilno formiraju (provereno).

Odradim:
Code:

      ExecSQL;                              
      IBTransaction2->Commit             //po pravilu


ALI se podaci NEKADA ne upisu u bazu (ovo 'nekada' nisam uspeo da provlim!)!
Nema nikakve poruke o gresci (?!).


Moj sledeci korak je da sve svedem na jednu IBTransaction, ali to osiromasuje inicijalnu ideju.
Da li je uopste problem nastao zbog koriscenja 2 transakcije? Ako se radi o necemu drugom -dzabe mi prepravka :(


Hvala unapred! Pozdrav!


P.S.
X Files, sorry ako se tema odnosi na Interbase/Firebird. Prebaci je tamo, ako sam pogresio.
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije24.01.2008. u 23:44 - pre 197 meseci
Promaklo mi je da naglasim:

Transakcija IBTransaction1 je svo vreme aktivna, posto 'drzi' popunjen DBGrid u 1. formi;
Otvara se 2. forma.
IBTransaction2 manipuslishe podatcima na osnovu naredbi 2. forme (insert, update, delete; uvek Commit na kraju);
zatvara se 2. forma; izmeni se sadrzaj StringGrid-a;
Ponovo se otvara 2. forma;
itd.


Kada se zavrsi sa radom, zatvori se 1. forma(izvrsi se IBTransaction1->Commit).

Detaljnije sam izlozio princip rada.


Pozdrav!



 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije25.01.2008. u 08:45 - pre 197 meseci
> ALI se podaci NEKADA ne upisu u bazu (ovo 'nekada' nisam uspeo da provlim!)!
> Nema nikakve poruke o gresci (?!).
> Moj sledeci korak je da sve svedem na jednu IBTransaction, ali to osiromasuje inicijalnu ideju.
> Da li je uopste problem nastao zbog koriscenja 2 transakcije? Ako se radi o necemu drugom -dzabe mi prepravka :(

Možeš imati dve nezavisne transakcije bez problema. Ako te pratim u drugoj formi se unose child slogovi? Proveri da li startuješ drugu transakciju i kakve su joj opcije (default su OK), da li upisuješ ID parent sloga u child tabelu i da li taj slog postoji i commitovan je u parent tabeli, kako ti izgleda INSERT kveri i da li imaš neke triggere. Odakle gledaš da li je slog ubačen u tabelu, vodi računa da moraš refrešovati dataset iz koga to radiš a moguće je i ponovo startovati transakciju.
Ako ništa ne pomogne, gledaj da svedeš program ili test na što je jednostavniji, tako se lakše pronađe.
 
Odgovor na temu

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Re: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije26.01.2008. u 12:49 - pre 197 meseci
Dopuna scenarija: imam parent formu, i child formu (sa 1. sam oznacio parent sa 2. child).
Nema reci o parent-child odnosu tabela u bazi.


Da li je neophodno explicitno startovati transakciju?

Ono sto ja uradim svodi se na princip:

Code:
  
     AnsiString data3 = "INSERT INTO ....";
     DataModule2->IBQuery5->SQL->Clear();

     DataModule2->IBQuery5->SQL->Add(data3);
     DataModule2->IBQuery5->ExecSQL;

     DataModule2->IBTransaction1->Commit();


Dakle, nemam explicitno startovanje transakcije. Ovo je verovatno potencijalni izvor greske!? Ali, pretpostavljam, da bi mi se javio exception No active Transactions?



Probao sam refresh DataSet-a, ali javlja se greska:

Cannot refresh row. (No refresh query)

Sta znachi refresh query? Gde se postavlja?
za DataSet sam dosada koristio samo Open();


Pozdrav!


 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije26.01.2008. u 17:36 - pre 197 meseci
> Da li je neophodno explicitno startovati transakciju?

Ako je setovan IBTransaction.AllowAutoStart nije, ali je dobra praksa lakše se prati.

> Ono sto ja uradim svodi se na princip:



> DataModule2->IBQuery5->SQL->Add(data3);
> DataModule2->IBQuery5->ExecSQL;
> DataModule2->IBTransaction1->Commit();

Da li dataset koji prikazuje podatke u gridu koristi IBTransaction1 ili ne? Kako gledaš da li su podaci upisani u bazu, iz tvog programa ili nekog drugog?

> Sta znachi refresh query? Gde se postavlja? za DataSet sam dosada koristio samo Open();

To je upit koji će se pozvati kada treba osvežiti podatke u datasetu, recimo samo da se ponovo iščita slog kod koga je jedno polje promenjeno. Pogledaj recimo TIBDataset ima RefreshSQL, ModifySQL, InsertSQL i SelectSQL.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Borland6 C++ i InterBase/Firebird: problem sa 2 transakcije

[ Pregleda: 2413 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.