veri tabanındaki değişikliği alğılamıyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

veri tabanındaki değişikliği alğılamıyor

Mesaj gönderen forumsad »

aşağıdaki kod ile

Kod: Tümünü seç

procedure TDMoyunlar.DataModuleCreate(Sender: TObject);
begin
try
DMoyunlar.IBDatabase1.DatabaseName:=_ip1+':'+_laneDByol+'\system\vt\OYUNLAR.FDB';
DMoyunlar.IBDatabase1.Connected:=True;
DMoyunlar.IBTransaction1.Active:=True;


except     //hata bölümü
     begin
     errorKaydet('DMoyunlar.DataModuleCreate');
     end;
     end;
end;
veri tabanına bağlanıyorum

aşağıdaki kod ise timer ile sürekli veritabaını okuyor

Kod: Tümünü seç

procedure TDMoyunlar.tmrOynDrmTimer(Sender: TObject);
begin
// ÖNCE OYUN VARMI BAK ----------------------------------------------------------
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from TBL_OYUNLARGECICI where ID=1');
IBQuery1.Open;
DMoyunlar.IBTransaction1.CommitRetaining;
if IBQuery1.fieldbyname('OYDRM').value<>Null then
    begin
    _drm1:=StrToInt(IBQuery1.fieldbyname('OYDRM').value);
    if _drm1=1 then frmMain.L1.Visible:=True;
    end
    else
    begin
    frmMain.L1.Visible:=false;
    end;

end;
sorun şu veritanında ilğili alanda değişiklik oluyor ama kod bunu alğılamıyor
sorun ne olabilir acaba

teşekkürler
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2382
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: veri tabanındaki değişikliği alğılamıyor

Mesaj gönderen freeman35 »

sorunla karşılaştığınızda en güzel yöntem, kendinizi bilgisayarın yerine koyun ve hiç yorum yapmadan, bir kağıt kalem alıp yazarak tek tek komutları çalıştırmak, sorunu bulmanıza yardım eder.
IBQuery1 yi kapat
IBQuery1 sql text ini sil
IBQuery1 sql text i ekle
IBQuery1 i aç
DMoyunlar.IBTransaction1.CommitRetaining; DMoyunlar.IBTransaction1. içine biriktirilmiş işlemleri veritabanına kalıcı olarak ekle ??? bu bilgi yığını içinde neler var ki?
IBQuery1 i etkilemez bu işlem, çünkü commit ten önce YENİ açılıyor

if IBQuery1.fieldbyname('OYDRM').value<>Null then
begin
_drm1:=StrToInt(IBQuery1.fieldbyname('OYDRM').value);
if _drm1=1 then frmMain.L1.Visible:=True;
end

kodları sadeleştirin, yaptım oldu deyip bırakmayın

frmMain.L1.Visible:=(IBQuery1.fieldbyname('OYDRM').asinteger=1);
ilgili field null ise AsInteger 0 değeri döndürür, asinteger=1 bunu compiler bir sorgu olarak görüp, sonucu True False olarak döndürüyor zaten (hangi versiyondan sonraydı ahtırlamıyorum ama kesin Delphi 7 ve üzeri kullanıyorsundur bu kod çalışır)
Timer default değerde zaten saniyede bir tetiklenir query yi habire sql i silip tekrar ekleyip muhtemelen bağlı olduğu transaction i commit et 3-5 dakka sona sistemin çöker.Queriyi bir kez yaz, parametre değişeceksede parambyname le sadece gereken parametreleri gönder, query i kapatıp transaction ı commit edip query yi aç.
bu arada DMoyunlar.IBTransaction1.InTransation false sa kodun çalışmasına gerek olmayan kesimlerini blockla, performans artışı sağlar
amaç sadece veritabanından değişiklik varmı kontrolü yapılacaksa, timer a ne gerek var sisteme yük, Firebird de "event" var her kim kayıt yaparsa ardından event gönderir, diğer bağlı nekadar terminal varsa haberdar olur. dakikada 60 kez db ye erişmek yerine sadece gerektiğinde baklır.
amacın networkte çalışan oyunsa ve bağlı olanlara bilgi göndermekse tcp/ip ile göndermek çokdaha performanslı olacaktır, oyunda bilgi gönderme işi çok sık olacaksa ve arada kayıp olsada sıkıntı değil ise udp de işini görecektir. ha bunlar ne diyeceksen sormadan önce indy, tcp/ip, socket olarak araştır
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: veri tabanındaki değişikliği alğılamıyor

Mesaj gönderen forumsad »

Kod: Tümünü seç

IBDatabase1.DatabaseName:=_ip1+':'+_laneDByol+'\system\vt\OYUNLAR.FDB';
IBDatabase1.Connected:=True;
// ÖNCE OYUN VARMI BAK ----------------------------------------------------------

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select OYNDRM from TBL_OYUNDURUM where ID=1');
IBQuery1.open;

_drm1:=StrToInt(IBQuery1.fieldbyname('OYNDRM').value);
if _drm1=1 then frmMain.L1.Visible:=True;
if _drm1=0 then frmMain.L1.Visible:=false;

IBDatabase1.Connected:=false;
timer 10 sn'de bir bağlanıp okuyor oyun durumunu server/client olarak değilde direkt veritabanından öğrenmenin daha iyi olacağını düşündüm(2pc arasında)
veritabanına 1 kere bağlanıp sonra değişiklikleri almaya çalıştım ama olmadı ayrı bir tablo açtım tabloya 10 sn'de bir bağlanıp durumu okuyorum sonra bağlantıyı kapatıyorum başka türlü beceremedim..

saygılarımla
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: veri tabanındaki değişikliği alğılamıyor

Mesaj gönderen forumsad »

Kod: Tümünü seç

IBQuery1.Close;
IBTransaction1.Commit;
IBQuery1.open;

frmMain.L1.Visible:=(IBQuery1.fieldbyname('OYNDRM').asinteger=1);
uyarılarınızı okuyarak timer kodunu yukardaki şekilde sadeleştirdim dediğiniz gibi daha iyi oldu..sıkıntısız çalışıyor...

saygılarımla
Cevapla