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.
delphi'de interbase için hazırlanmış script'i çalıştırmak.
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:
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...
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;
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...