Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Database Insert Update İşleminin Uzun Süremesi
#1
Merhaba,

Alttaki kodlarla daha önce kayıtlar yoksa insert sonra, tüm kayıtlar yeni sıra numarasına göre databaseye update ediyorum.
Kayıt sayısı minimum 1000, bazen işlem dakikalarca sürüyor ve program donuyor bu işlemi nasıl hızlandırır veya arka planda kodların işlem yapmasını nasıl sağlarım.

Sqlite ile çok kısa sürüyordu acaba sorun Firebird dataseden mi kaynaklı acaba?




procedure TForm.ButtonSaveClick(Sender: TObject);
var
  I: Integer;
  FDQ: TFDQuery;
begin
  TButton(Sender).Enabled := False;
  FDQ := TFDQuery.Create(Nil);
  FDQ.Connection := FDConnection;
  FDQ.DisableControls;
  ListView1.BeginUpdate;
  try
    for I := 0 to ListView1.ItemCount - 1 do
    begin
      Application.ProcessMessages;
      if SameText(ListView1.Items[I].Data['Id'].ToString, '0') then
      begin
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Insert Into Llist (Must, Title, Link, Content, Note)');
        FDQ.SQL.Add(' Values (:Mus, :Tit, :Lin, :Con, :Note)');
        FDQ.ParamByName('Mus').AsInteger := 0;
        FDQ.ParamByName('Tit').AsString := ListView1.Items[I].Data['Title'].AsString;
        FDQ.ParamByName('Lin').AsString := ListView1.Items[I].Data['Link'].AsString;
        FDQ.ParamByName('Con').AsString := ListView1.Items[I].Data['Content'].AsString;
        FDQ.ParamByName('Note').AsString := ListView1.Items[I].Data['Note'].AsString;
        FDQ.ExecSQL;
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Select Max(Id) As Id From Llist');
        FDQ.Prepared := True;
        FDQ.Open;
        ListView1.Items[I].Data['Id'] := NumberConvert(FDQ.FieldByName('Id').AsInteger);
      end;
      ListView1.Items[I].Data['Must'] := NumberConvert(ListView1.Items[I].Index) + 1; // Yeni Sırano
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update PLlist Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Mus').AsInteger := ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ParamByName('Id').AsInteger := ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.EnableControls;
    FDQ.Free;
    ListView1.EndUpdate;
    TButton(Sender).Enabled := True;
  end;
end; 
Cevapla
#2
(20-05-2024, Saat: 21:05)Altıner Adlı Kullanıcıdan Alıntı: Merhaba,

Alttaki kodlarla daha önce kayıtlar yoksa insert sonra, tüm kayıtlar yeni sıra numarasına göre databaseye update ediyorum.
Kayıt sayısı minimum 1000, bazen işlem dakikalarca sürüyor ve program donuyor bu işlemi nasıl hızlandırır veya arka planda kodların işlem yapmasını nasıl sağlarım.

Sqlite ile çok kısa sürüyordu acaba sorun Firebird dataseden mi kaynaklı acaba?




procedure TForm.ButtonSaveClick(Sender: TObject);
var
  I: Integer;
  FDQ: TFDQuery;
begin
  TButton(Sender).Enabled := False;
  FDQ := TFDQuery.Create(Nil);
  FDQ.Connection := FDConnection;
  FDQ.DisableControls;
  ListView1.BeginUpdate;
  try
    for I := 0 to ListView1.ItemCount - 1 do
    begin
      Application.ProcessMessages;
      if SameText(ListView1.Items[I].Data['Id'].ToString, '0') then
      begin
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Insert Into Llist (Must, Title, Link, Content, Note)');
        FDQ.SQL.Add(' Values (:Mus, :Tit, :Lin, :Con, :Note)');
        FDQ.ParamByName('Mus').AsInteger := 0;
        FDQ.ParamByName('Tit').AsString := ListView1.Items[I].Data['Title'].AsString;
        FDQ.ParamByName('Lin').AsString := ListView1.Items[I].Data['Link'].AsString;
        FDQ.ParamByName('Con').AsString := ListView1.Items[I].Data['Content'].AsString;
        FDQ.ParamByName('Note').AsString := ListView1.Items[I].Data['Note'].AsString;
        FDQ.ExecSQL;
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Select Max(Id) As Id From Llist');
        FDQ.Prepared := True;
        FDQ.Open;
        ListView1.Items[I].Data['Id'] := NumberConvert(FDQ.FieldByName('Id').AsInteger);
      end;
      ListView1.Items[I].Data['Must'] := NumberConvert(ListView1.Items[I].Index) + 1; // Yeni Sırano
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update PLlist Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Mus').AsInteger := ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ParamByName('Id').AsInteger := ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.EnableControls;
    FDQ.Free;
    ListView1.EndUpdate;
    TButton(Sender).Enabled := True;
  end;
end; 

Merhabalar,

Sıralama işlemini bir Procedure ile yapsanız. 
SET TERM !! ;

CREATE PROCEDURE UpdateSiraNo
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE new_sira_no INTEGER;
BEGIN
 new_sira_no = 0;

 FOR SELECT id FROM ana_tablo ORDER BY id INTO :id DO
 BEGIN
   new_sira_no = new_sira_no + 1;
   UPDATE ana_tablo SET sıra_no = :new_sira_no WHERE id = :id;
 END
END !!

SET TERM ; !!

EXECUTE PROCEDURE UpdateSiraNo;
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#3
(21-05-2024, Saat: 11:47)hi_selamlar Adlı Kullanıcıdan Alıntı:
(20-05-2024, Saat: 21:05)Altıner Adlı Kullanıcıdan Alıntı: Merhaba,

Alttaki kodlarla daha önce kayıtlar yoksa insert sonra, tüm kayıtlar yeni sıra numarasına göre databaseye update ediyorum.
Kayıt sayısı minimum 1000, bazen işlem dakikalarca sürüyor ve program donuyor bu işlemi nasıl hızlandırır veya arka planda kodların işlem yapmasını nasıl sağlarım.

Sqlite ile çok kısa sürüyordu acaba sorun Firebird dataseden mi kaynaklı acaba?




procedure TForm.ButtonSaveClick(Sender: TObject);
var
  I: Integer;
  FDQ: TFDQuery;
begin
  TButton(Sender).Enabled := False;
  FDQ := TFDQuery.Create(Nil);
  FDQ.Connection := FDConnection;
  FDQ.DisableControls;
  ListView1.BeginUpdate;
  try
    for I := 0 to ListView1.ItemCount - 1 do
    begin
      Application.ProcessMessages;
      if SameText(ListView1.Items[I].Data['Id'].ToString, '0') then
      begin
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Insert Into Llist (Must, Title, Link, Content, Note)');
        FDQ.SQL.Add(' Values (:Mus, :Tit, :Lin, :Con, :Note)');
        FDQ.ParamByName('Mus').AsInteger := 0;
        FDQ.ParamByName('Tit').AsString := ListView1.Items[I].Data['Title'].AsString;
        FDQ.ParamByName('Lin').AsString := ListView1.Items[I].Data['Link'].AsString;
        FDQ.ParamByName('Con').AsString := ListView1.Items[I].Data['Content'].AsString;
        FDQ.ParamByName('Note').AsString := ListView1.Items[I].Data['Note'].AsString;
        FDQ.ExecSQL;
        FDQ.Active := False;
        FDQ.Close;
        FDQ.SQL.Clear;
        FDQ.SQL.Add('Select Max(Id) As Id From Llist');
        FDQ.Prepared := True;
        FDQ.Open;
        ListView1.Items[I].Data['Id'] := NumberConvert(FDQ.FieldByName('Id').AsInteger);
      end;
      ListView1.Items[I].Data['Must'] := NumberConvert(ListView1.Items[I].Index) + 1; // Yeni Sırano
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update PLlist Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Mus').AsInteger := ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ParamByName('Id').AsInteger := ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.EnableControls;
    FDQ.Free;
    ListView1.EndUpdate;
    TButton(Sender).Enabled := True;
  end;
end; 

Merhabalar,

Sıralama işlemini bir Procedure ile yapsanız. 
SET TERM !! ;

CREATE PROCEDURE UpdateSiraNo
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE new_sira_no INTEGER;
BEGIN
 new_sira_no = 0;

 FOR SELECT id FROM ana_tablo ORDER BY id INTO :id DO
 BEGIN
   new_sira_no = new_sira_no + 1;
   UPDATE ana_tablo SET sıra_no = :new_sira_no WHERE id = :id;
 END
END !!

SET TERM ; !!

EXECUTE PROCEDURE UpdateSiraNo;

Elinize sağlık sayenizde bir şey daha öğrenmiş oldum, kendime göre uyarladım. 

Fakat,
1. Verileri ListViewden for döngüsü ile databaseye kayıt yapıyorum, fakat ListViewi tekrar listelediğimde doğru sıralamada ile listeleme gelmiyor.
2. Bazen Databaseye insert yapmıyorum sadece sıra no değişikliği yapıyorum bu nedenden dolayı benim için kullanışlı değil.


 
     FDQuery.Connection := FDConnection;
      FDQuery.Active := False;
      FDQuery.Close;
      FDQuery.SQL.Clear;
      FDQuery.SQL.Add('SET TERM !!;(');
      FDQuery.SQL.Add('CREATE PROCEDURE UpdateSiraNo');
      FDQuery.SQL.Add('AS');
      FDQuery.SQL.Add('DECLARE VARIABLE id INTEGER;');
      FDQuery.SQL.Add('DECLARE VARIABLE MUST INTEGER;');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = 0;');
      FDQuery.SQL.Add('FOR SELECT id FROM LLIST ORDER BY id INTO :id DO');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = MUST + 1;');
      FDQuery.SQL.Add('UPDATE LLIST SET MUST = :new_sira_no WHERE id = :id;');
      FDQuery.SQL.Add('END');
      FDQuery.SQL.Add('END !!');
      FDQuery.SQL.Add('SET TERM; !!');
      FDQuery.SQL.Add('EXECUTE PROCEDURE UpdateSiraNo;');
Cevapla
#4
Merhaba, Cursor içerisinde update' i daha hızlı kılmak için aşağıdaki gibi kullanmanızı öneririm.

FOR SELECT id FROM LLIST ORDER BY id INTO :id AS CURSOR cur DO
BEGIN
   MUST = MUST + 1;
   UPDATE LLIST SET MUST = :new_sira_no WHERE CURRENT OF cur;
END
Cevapla
#5
(21-05-2024, Saat: 19:27)Altıner Adlı Kullanıcıdan Alıntı:
(21-05-2024, Saat: 11:47)hi_selamlar Adlı Kullanıcıdan Alıntı: Merhabalar,

Sıralama işlemini bir Procedure ile yapsanız. 
SET TERM !! ;

CREATE PROCEDURE UpdateSiraNo
AS
DECLARE VARIABLE id INTEGER;
DECLARE VARIABLE new_sira_no INTEGER;
BEGIN
 new_sira_no = 0;

 FOR SELECT id FROM ana_tablo ORDER BY id INTO :id DO
 BEGIN
   new_sira_no = new_sira_no + 1;
   UPDATE ana_tablo SET sıra_no = :new_sira_no WHERE id = :id;
 END
END !!

SET TERM ; !!

EXECUTE PROCEDURE UpdateSiraNo;

Elinize sağlık sayenizde bir şey daha öğrenmiş oldum, kendime göre uyarladım. 

Fakat,
1. Verileri ListViewden for döngüsü ile databaseye kayıt yapıyorum, fakat ListViewi tekrar listelediğimde doğru sıralamada ile listeleme gelmiyor.
2. Bazen Databaseye insert yapmıyorum sadece sıra no değişikliği yapıyorum bu nedenden dolayı benim için kullanışlı değil.


 
     FDQuery.Connection := FDConnection;
      FDQuery.Active := False;
      FDQuery.Close;
      FDQuery.SQL.Clear;
      FDQuery.SQL.Add('SET TERM !!;(');
      FDQuery.SQL.Add('CREATE PROCEDURE UpdateSiraNo');
      FDQuery.SQL.Add('AS');
      FDQuery.SQL.Add('DECLARE VARIABLE id INTEGER;');
      FDQuery.SQL.Add('DECLARE VARIABLE MUST INTEGER;');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = 0;');
      FDQuery.SQL.Add('FOR SELECT id FROM LLIST ORDER BY id INTO :id DO');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = MUST + 1;');
      FDQuery.SQL.Add('UPDATE LLIST SET MUST = :new_sira_no WHERE id = :id;');
      FDQuery.SQL.Add('END');
      FDQuery.SQL.Add('END !!');
      FDQuery.SQL.Add('SET TERM; !!');
      FDQuery.SQL.Add('EXECUTE PROCEDURE UpdateSiraNo;');

bazen insert , update işlemlerinde hata alıyorum sözünüze istinaden,
FD Bileşenlerinde Try exception handling içinde   execute etmeden önce    FDConnection.StartTransaction, ettikten sonra FDConnection.Commit yada hataya düşerse FDConnection.Rollback  yöntemi ile işlemlerinizi daha güvenli yürütebilirsiniz.

function ExecuteUpdateSiraNoProcedure: Boolean;
var
  FDConnection: TFDConnection;
  FDQuery: TFDQuery;
begin
  Result := False;
  FDConnection := TFDConnection.Create(nil);
  FDQuery := TFDQuery.Create(nil);
  try
    // FDConnection'ı yapılandırın
    FDConnection.ConnectionDefName := 'MyConnectionDef';
    FDConnection.LoginPrompt := False;
    FDConnection.Open;

    // FDQuery bağlantısını ayarlayın
    FDQuery.Connection := FDConnection;

    // İşlemi başlat
    FDConnection.StartTransaction;
    try
      // SQL komutlarını ayarlayın ve çalıştırın
      FDQuery.Active := False;
      FDQuery.Close;
      FDQuery.SQL.Clear;
      FDQuery.SQL.Add('SET TERM !!;');
      FDQuery.SQL.Add('CREATE PROCEDURE UpdateSiraNo');
      FDQuery.SQL.Add('AS');
      FDQuery.SQL.Add('DECLARE VARIABLE id INTEGER;');
      FDQuery.SQL.Add('DECLARE VARIABLE MUST INTEGER;');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = 0;');
      FDQuery.SQL.Add('FOR SELECT id FROM LLIST ORDER BY id INTO :id DO');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = MUST + 1;');
      FDQuery.SQL.Add('UPDATE LLIST SET MUST = :MUST WHERE id = :id;');
      FDQuery.SQL.Add('END');
      FDQuery.SQL.Add('END !!');
      FDQuery.SQL.Add('SET TERM ;!!');
      FDQuery.SQL.Add('EXECUTE PROCEDURE UpdateSiraNo;');
      
      // Sorguyu çalıştırın
      FDQuery.ExecSQL;

      // İşlemi tamamla
      FDConnection.Commit;
      Result := True; // İşlem başarıyla tamamlandı
    except
      on E: Exception do
      begin
        // Hata durumunda işlemi geri al
        FDConnection.Rollback;
        Result := False; // Hata oluştu
      end;
    end;
  finally
    FDQuery.Free;
    FDConnection.Free;
  end;
end;



Cevapla
#6
(22-05-2024, Saat: 00:01)Mesut Adlı Kullanıcıdan Alıntı:
(21-05-2024, Saat: 19:27)Altıner Adlı Kullanıcıdan Alıntı: Elinize sağlık sayenizde bir şey daha öğrenmiş oldum, kendime göre uyarladım. 

Fakat,
1. Verileri ListViewden for döngüsü ile databaseye kayıt yapıyorum, fakat ListViewi tekrar listelediğimde doğru sıralamada ile listeleme gelmiyor.
2. Bazen Databaseye insert yapmıyorum sadece sıra no değişikliği yapıyorum bu nedenden dolayı benim için kullanışlı değil.


 
     FDQuery.Connection := FDConnection;
      FDQuery.Active := False;
      FDQuery.Close;
      FDQuery.SQL.Clear;
      FDQuery.SQL.Add('SET TERM !!;(');
      FDQuery.SQL.Add('CREATE PROCEDURE UpdateSiraNo');
      FDQuery.SQL.Add('AS');
      FDQuery.SQL.Add('DECLARE VARIABLE id INTEGER;');
      FDQuery.SQL.Add('DECLARE VARIABLE MUST INTEGER;');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = 0;');
      FDQuery.SQL.Add('FOR SELECT id FROM LLIST ORDER BY id INTO :id DO');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = MUST + 1;');
      FDQuery.SQL.Add('UPDATE LLIST SET MUST = :new_sira_no WHERE id = :id;');
      FDQuery.SQL.Add('END');
      FDQuery.SQL.Add('END !!');
      FDQuery.SQL.Add('SET TERM; !!');
      FDQuery.SQL.Add('EXECUTE PROCEDURE UpdateSiraNo;');

bazen insert , update işlemlerinde hata alıyorum sözünüze istinaden,
FD Bileşenlerinde Try exception handling içinde   execute etmeden önce    FDConnection.StartTransaction, ettikten sonra FDConnection.Commit yada hataya düşerse FDConnection.Rollback  yöntemi ile işlemlerinizi daha güvenli yürütebilirsiniz.

function ExecuteUpdateSiraNoProcedure: Boolean;
var
  FDConnection: TFDConnection;
  FDQuery: TFDQuery;
begin
  Result := False;
  FDConnection := TFDConnection.Create(nil);
  FDQuery := TFDQuery.Create(nil);
  try
    // FDConnection'ı yapılandırın
    FDConnection.ConnectionDefName := 'MyConnectionDef';
    FDConnection.LoginPrompt := False;
    FDConnection.Open;

    // FDQuery bağlantısını ayarlayın
    FDQuery.Connection := FDConnection;

    // İşlemi başlat
    FDConnection.StartTransaction;
    try
      // SQL komutlarını ayarlayın ve çalıştırın
      FDQuery.Active := False;
      FDQuery.Close;
      FDQuery.SQL.Clear;
      FDQuery.SQL.Add('SET TERM !!;');
      FDQuery.SQL.Add('CREATE PROCEDURE UpdateSiraNo');
      FDQuery.SQL.Add('AS');
      FDQuery.SQL.Add('DECLARE VARIABLE id INTEGER;');
      FDQuery.SQL.Add('DECLARE VARIABLE MUST INTEGER;');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = 0;');
      FDQuery.SQL.Add('FOR SELECT id FROM LLIST ORDER BY id INTO :id DO');
      FDQuery.SQL.Add('BEGIN');
      FDQuery.SQL.Add('MUST = MUST + 1;');
      FDQuery.SQL.Add('UPDATE LLIST SET MUST = :MUST WHERE id = :id;');
      FDQuery.SQL.Add('END');
      FDQuery.SQL.Add('END !!');
      FDQuery.SQL.Add('SET TERM ;!!');
      FDQuery.SQL.Add('EXECUTE PROCEDURE UpdateSiraNo;');
      
      // Sorguyu çalıştırın
      FDQuery.ExecSQL;

      // İşlemi tamamla
      FDConnection.Commit;
      Result := True; // İşlem başarıyla tamamlandı
    except
      on E: Exception do
      begin
        // Hata durumunda işlemi geri al
        FDConnection.Rollback;
        Result := False; // Hata oluştu
      end;
    end;
  finally
    FDQuery.Free;
    FDConnection.Free;
  end;
end;




Teşekkür ederim işimi çözdü.






(21-05-2024, Saat: 22:52)anemos Adlı Kullanıcıdan Alıntı: Merhaba, Cursor içerisinde update' i daha hızlı kılmak için aşağıdaki gibi kullanmanızı öneririm.

FOR SELECT id FROM LLIST ORDER BY id INTO :id AS CURSOR cur DO
BEGIN
   MUST = MUST + 1;
   UPDATE LLIST SET MUST = :new_sira_no WHERE CURRENT OF cur;
END

Teşekkür ederim Sorunu çözdüm
Cevapla
#7
Cursor kullanımını hiç bir RDBMS'de önermiyorum. Onun yerine update'e uğrayacak tabloya self join yaparak çözebilirsiniz eğer tek başına where condition yeterli gelmiyor ise. Cursor'lar oldukça yavaştırlar.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
Selam,
Neden bütün işlemlerinizi StoredProcedure ile yapmıyorsunuz ?
ayrıca neden her defasında UpdateSiraNo procedurunu tekrar oluşturuyorsunuz ?
WWW
Cevapla
#9
Bence sorgulardaki SQL cümlelerinizi kontrol edin.
Mesela Insert işleminden sonra bir daha SELECT yapmadan yapılan kaydın bilgilerini dönebilirsiniz. Haliyle n tane SELECT azalmış olur. Bunu veri tabanı sistemlerinin çoğu sağlıyor.
MSSQL ve PostgreSQL ile bunu rahatlıkla yapabiliyorsunuz. Diğerleri için de araştırma yapmak gerekir.
MSSQL
https://stackoverflow.com/questions/7917...ter-insert

PostgreSQL
https://www.postgresql.org/docs/current/...rning.html

Firebird
https://firebirdsql.org/refdocs/langrefu...nsert.html

Sıralama içinde procedure veya aynı mantıkla windows function denilen db özellikleri var. Bunları araştırarak yapabilirsiniz.
Fakat ilk dediğim işlemi yapmanız. Size oldukça hız sağlayacaktır.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  (Bilgi) International database ve dil desteği anemos 3 982 26-09-2024, Saat: 11:08
Son Yorum: klavye
  Firebird Database Create Doğru mu? Altıner 2 1.311 02-05-2024, Saat: 11:00
Son Yorum: hi_selamlar
  Firebird - Unavailable Database Hatası sunbeki 12 6.821 23-06-2021, Saat: 16:16
Son Yorum: esistem
  Çalışma Anında Database Oluşturma akuyumcu63 5 4.646 27-03-2021, Saat: 20:16
Son Yorum: sadikacar60
  Firebird Database Oluşturma SercanTEK 10 10.598 23-08-2020, Saat: 18:10
Son Yorum: akuyumcu63



Konuyu Okuyanlar: 1 Ziyaretçi