Delphi ile SQL Den Gelen Hatayı yakalama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
paranoyaks
Üye
Mesajlar: 31
Kayıt: 04 Oca 2008 01:53
Konum: Adana

Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen paranoyaks »

Merhabalar;
Benim problemim yazmış olduğum programı müşterime kurarken kendi kullandığım veri tabanını müşteriye atıyorum ve foreing key bağlantılarım olduğu için tabloların içeriğini temizlemek tam bir işkence oluyor müşteriye temiz bir veritabanı atmak gibi bir şansım yok (temiz veri tabanı konusunda yorum yapmadan) yardımcı olmaya çalışırsanız sevinirim yapmaya çalıştığım şey listboxta veri tabanındaki tüm tabloları listeletiyorum multiselect özelliği açık listbox'un seçili olan tüm tablolara delete from göndermek istiyorum Sql de her delete çektiği tabloda foreing bağlantısı varsa bu tablo şu tablo ile ilişkide silemiyorum diyor orada uyarı verdiği tablonun adını alıp önce ona delete from çektirmek istiyorum delete from seçili listedeki tüm tablolarda başarılı sonuç verene kadar dönmesini istiyorum bu konuda yardımlarınızı bekliyorum şimdiden emek harcayan herkese çok teşekkür ederim.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen unicorn64 »

foreign keyleri cascade olarak ayarlarsanız, master tablodaki kayıt silindiğinde detail tablodaki kayıtlar da otomatik olarak silinir,

yada tabloları listeye eklerken master detaile dikkat ederek önce detail tablolarınızı sonra master tablolarınızı ekleyin ve silme işlemini ondan sonra yapın...

yada

Kod: Tümünü seç

var
  kontrol:boolean;
  i:integer;
begin
  
  repeat 
    kontrol:=true;
    for i:=0 to liste.count-1 do
    begin
      try 
         tabloyuSil(liste.items[i]);
      except
         kontrol:=false;
      end;
    end;
  until kontrol=true;

end;

gibi bi kontrol olabilir, kodu ezbere yazdım gözden geçirirsiniz...
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
paranoyaks
Üye
Mesajlar: 31
Kayıt: 04 Oca 2008 01:53
Konum: Adana

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen paranoyaks »

Gerçekten o kadar çok tablo varki o sırayı biliyor olmak yada çıkarmak imkansıza yakın birşey :) o yüzden zaten sqlde delete komutu verildiğinde geri dönen bağlantılı tablolarınız vardır hatasındaki tablonun adını alıp yönlendirmelerle kendisinin otomatik silmesini istiyorum dediğiniz şekilde çok zor
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen SimaWB »

Kod: Tümünü seç

ALTER TABLE tablo_ismi NOCHECK CONSTRAINT ALL
ile foreing key'leri iptal edebilirsin. Belki işine yarar.
There's no place like 127.0.0.1
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen sabanakman »

Tam olarak emin değilim ama

Kod: Tümünü seç

select ana.name from sysobjects as ana
left join (select id, parent_obj from sysobjects where xtype='F') as alt on ana.id=alt.parent_obj
where ana.xtype='U'
order by alt.parent_obj desc, alt.id, ana.id
sorgusundan gelen isim listesi sırasıyla sorun çıkarmayacak bir liste sunabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Nemesis2005
Üye
Mesajlar: 136
Kayıt: 18 Oca 2005 05:24
Konum: İzmir

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen Nemesis2005 »

Alıntıdır. Denemedim sonuç yazarsanız sevinirim...

karyelist tarafından 13 Ağustos 2010 tarihinde gönderildi

Veritabanı yöneticilerinin en çok sıkıntı çektiği konulardan bir tanesi işleri otomatik olarak değilde
manuel olarak yapmak.Çünkü bazen bir veritabanının içindeki tüm tabloların verilerini silmek gerekir.
Bunu en hızlı ve en az enerji ile yapabiliriz.Genelde delete ve truncate komutları ile bu tür işler yapılır.
Ancak eğer constraint verileri silerken hata vericektir yada triggerlar.
Constraintlerin bir kötü özelliğide budur.Bu sebeple en kolay yol aşağıdaki gibidir.

Yeni bir query penceresi açıp üstten veritabanını seçtikten sonra

EXEC sp_MSForEachTable ‘DELETE FROM ?’–Burdaki soru işareti her tabloyu gezdiğinde tablonun adını
alıp soru işaretinin yerine tek tek her tablonun içindeki bilgileri silip diğer tabloya geçer.
For each mantığı tüm dataları siler dikkat etmek gereklidir.

Eğer constraint olan tablolarımız ve buna tablolarda datalarımız var ise asağıdaki
prosedür işinizi görecektir.Önce constraintlerin verileri engellemesi ortadan kaldırılır.
Sonra trigger var ise tüm triggerları kapatır.Daha sonra dataları siler.Aynı iş mantığı ile datalar
silindikten hemen sonra constraintler aktif hale getirilir,triggerlar aktif hale getirilir.
En son tüm tablolardaki mevcut kayıt satır sayılarını gösterir.

CREATE PROCEDURE sp_TümDatalarıSil

AS
EXEC sp_MSForEachTable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? DISABLE TRIGGER ALL’
EXEC sp_MSForEachTable ‘DELETE FROM ?’
EXEC sp_MSForEachTable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? ENABLE TRIGGER ALL’
EXEC sp_MSFOREACHTABLE ‘SELECT * FROM ?’
GO
Her iyinin içinde bir Kötülük.Her Kötnün içide de bir iyilik vardır
paranoyaks
Üye
Mesajlar: 31
Kayıt: 04 Oca 2008 01:53
Konum: Adana

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen paranoyaks »

SimaWB yazdı:

Kod: Tümünü seç

ALTER TABLE tablo_ismi NOCHECK CONSTRAINT ALL
ile foreing key'leri iptal edebilirsin. Belki işine yarar.
Devamında tekrardan bağlamak gerekmiyecekmi ? bu sıkıntı olacaktır.
paranoyaks
Üye
Mesajlar: 31
Kayıt: 04 Oca 2008 01:53
Konum: Adana

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen paranoyaks »

Nemesis2005 yazdı:Alıntıdır. Denemedim sonuç yazarsanız sevinirim...

karyelist tarafından 13 Ağustos 2010 tarihinde gönderildi

Veritabanı yöneticilerinin en çok sıkıntı çektiği konulardan bir tanesi işleri otomatik olarak değilde
manuel olarak yapmak.Çünkü bazen bir veritabanının içindeki tüm tabloların verilerini silmek gerekir.
Bunu en hızlı ve en az enerji ile yapabiliriz.Genelde delete ve truncate komutları ile bu tür işler yapılır.
Ancak eğer constraint verileri silerken hata vericektir yada triggerlar.
Constraintlerin bir kötü özelliğide budur.Bu sebeple en kolay yol aşağıdaki gibidir.

Yeni bir query penceresi açıp üstten veritabanını seçtikten sonra

EXEC sp_MSForEachTable ‘DELETE FROM ?’–Burdaki soru işareti her tabloyu gezdiğinde tablonun adını
alıp soru işaretinin yerine tek tek her tablonun içindeki bilgileri silip diğer tabloya geçer.
For each mantığı tüm dataları siler dikkat etmek gereklidir.

Eğer constraint olan tablolarımız ve buna tablolarda datalarımız var ise asağıdaki
prosedür işinizi görecektir.Önce constraintlerin verileri engellemesi ortadan kaldırılır.
Sonra trigger var ise tüm triggerları kapatır.Daha sonra dataları siler.Aynı iş mantığı ile datalar
silindikten hemen sonra constraintler aktif hale getirilir,triggerlar aktif hale getirilir.
En son tüm tablolardaki mevcut kayıt satır sayılarını gösterir.

CREATE PROCEDURE sp_TümDatalarıSil

AS
EXEC sp_MSForEachTable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? DISABLE TRIGGER ALL’
EXEC sp_MSForEachTable ‘DELETE FROM ?’
EXEC sp_MSForEachTable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’
EXEC sp_MSForEachTable ‘ALTER TABLE ? ENABLE TRIGGER ALL’
EXEC sp_MSFOREACHTABLE ‘SELECT * FROM ?’
GO
Bu Yöntemi deniyoruz şimdilik başarılı bir sonuca ulaşamadım fakat bu yöntemle bir sonuç elde edersem burada paylaşımı gerçekteleştirecem.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen sabanakman »

Bu arada atlamışız ama hata mesajını yakalama konusuna gelince

Kod: Tümünü seç

try
  ADOConnection1.Execute('delete from tablo');
except
  on E:Exception do begin
    ShowMessage(Format('Silinemeyen tablo. Çıkan hata..:%s',[E.Message]));
  end;
end;
Buradaki E.Message oluşan hata mesajını aynen verecektir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
paranoyaks
Üye
Mesajlar: 31
Kayıt: 04 Oca 2008 01:53
Konum: Adana

Re: Delphi ile SQL Den Gelen Hatayı yakalama

Mesaj gönderen paranoyaks »

sabanakman yazdı:Bu arada atlamışız ama hata mesajını yakalama konusuna gelince

Kod: Tümünü seç

try
  ADOConnection1.Execute('delete from tablo');
except
  on E:Exception do begin
    ShowMessage(Format('Silinemeyen tablo. Çıkan hata..:%s',[E.Message]));
  end;
end;
Buradaki E.Message oluşan hata mesajını aynen verecektir.
:) çok teşekkür ederim şu an deneyebileceğim bir tablo yok ama bi deneme oluşturup kontrolünü yapacam hemen anladığım kadarı ile siz denemişsiniz çalışıyorsa sırası ile kontrol ettirip sildirebilirim hepsini delphi ile
Cevapla