delphi'de interbase için hazırlanmış script'i çalıştırmak.

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
ekazmaci
Üye
Mesajlar: 15
Kayıt: 18 Eyl 2003 04:38

delphi'de interbase için hazırlanmış script'i çalıştırmak.

Mesaj gönderen ekazmaci »

merhabalar
Delphi'de interbase veritabanı üzerinde yeni tablolar ve indexler oluşturmak için hazırlanmış bir SQL script'i nasıl çalıştırabilirim?
Teşekkürler.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Normalde tek bir komut olsa TQuery'ye yazip ExecSQL metodu ile çalıştırabilirsiniz. Fakat birden fazla komut olunca iş değişiyor tabi.

RXLib'in TSQLScrip isimli bir componenti vardi bir zamanlar bunu kullaniyordum fakat onda da trigger create veya alter etmelekte sorun yasadigim ve de satir sayisi fazla olunca (mesela 1000 )sebepsiz kilitlenme filan da eklenince her komutu ayri ayri çalıştıracak bir kod yazdım.

Şöyle ki 2 adet TSQLScript kullaniyorum. Bir tanesinin SQL'ine yüzlerce satır scriptimi yaziyor veya yapiştiriyorum. Fakat burada dikkat ettiğim konu her komutun arkasina kendi tanimladiğim bir komut ayiraci koyuyorum Mesela ben !!!! kullaniyorum. Programim içindeki bir kod ile de bu !!!! ile ayrılmış kodları okuyup diğer boştaki query'nin SQL'ine atıp oradan ExecSQL ile çalıştırıyorum. Fakat burada TSQLScript'in kullandığım özellikleri tamamen TQuery'de de olduğu için aynı işlemi TQuery ile yapabilirsiniz.
Belki işinize yarar, kullandığım kod şu:

Kod: Tümünü seç

procedure TFRM_PATCH2_07.TMR_BASLATimer(Sender: TObject);
var
  VAR_PLUS:smallint;
  VAR_SAYAC:integer;
begin
  TMR_BASLA.Enabled:=False;
  VAR_PLUS:=Round(90/7);
  with DTB_EMLAX do
  begin
    PRB_SQL_CODE.Position:=PRB_SQL_CODE.Position+5;
    try
      Connected:=True;
      DTB_EMLAX.StartTransaction;
      QRY_SQL.SQL.Clear;
      for VAR_SAYAC:=0 to SQL_KOD.SQL.Count-1 do
      begin
        QRY_SQL.SQL.Add(SQL_KOD.SQL[VAR_SAYAC]);
        if Pos('!!!!',SQL_KOD.SQL[VAR_SAYAC])>0 then
        begin
          QRY_SQL.SQL[QRY_SQL.SQL.Count-1]:=SubStringReplace(QRY_SQL.SQL[QRY_SQL.SQL.Count-1],'!!!!',' ');
          QRY_SQL.ExecSQL;
          PRB_SQL_CODE.Position:=PRB_SQL_CODE.Position+VAR_PLUS;
          Self.Refresh;
          QRY_SQL.SQL.Clear;
        end;
      end;
      LBL_COMPLETE.Visible:=True;
      DTB_EMLAX.Commit;
      Connected:=False;
    except
      on E: Exception do
      begin
        Showmessage(E.Message);
        DTB_EMLAX.Rollback;
      end;
    end;
  end;
  FRM_PATCH2_07.Close;
end;
SQL_KOD isimli TQuery'nin SQL'ine kodlarımı yazıyorum. QRY_SQL isimli olanda ise bu kodları çalıştırıyorum.
VAR_PLUS değişkeni ile scriptim kaç tane komut içeriyorsa ona göre dengeli bir progressbar çalıştırıyorum. SubStringReplace fonksiyonu da aslında işlev olarak StirngReplace fonksiyonunun aynısını yapiyor. !!!! gördüğü yere bir boşluk atiyor ki !!!! karakterleri veritabanina gönderilmesin. LBL_COMPLETE işin bittiğini gösteren bir label.

Kolay gelsin...
Kullanıcı avatarı
ekazmaci
Üye
Mesajlar: 15
Kayıt: 18 Eyl 2003 04:38

Mesaj gönderen ekazmaci »

göstermiş olduğunuz ilgiden ve yardımlarınızdan dolayı teşekkür ederim
iyi çalışmalar.
Cevapla