Delphi ile SQL Den Gelen Hatayı yakalama
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 31
- Kayıt: 04 Oca 2008 01:53
- Konum: Adana
Delphi ile SQL Den Gelen Hatayı yakalama
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.
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.
Re: Delphi ile SQL Den Gelen Hatayı yakalama
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
gibi bi kontrol olabilir, kodu ezbere yazdım gözden geçirirsiniz...
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;
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...

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...

-
- Üye
- Mesajlar: 31
- Kayıt: 04 Oca 2008 01:53
- Konum: Adana
Re: Delphi ile SQL Den Gelen Hatayı yakalama
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

Re: Delphi ile SQL Den Gelen Hatayı yakalama
Kod: Tümünü seç
ALTER TABLE tablo_ismi NOCHECK CONSTRAINT ALL
There's no place like 127.0.0.1
- 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
Tam olarak emin değilim amasorgusundan gelen isim listesi sırasıyla sorun çıkarmayacak bir liste sunabilir.
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
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
-
- Üye
- Mesajlar: 136
- Kayıt: 18 Oca 2005 05:24
- Konum: İzmir
Re: Delphi ile SQL Den Gelen Hatayı yakalama
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
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
-
- Üye
- Mesajlar: 31
- Kayıt: 04 Oca 2008 01:53
- Konum: Adana
Re: Delphi ile SQL Den Gelen Hatayı yakalama
Devamında tekrardan bağlamak gerekmiyecekmi ? bu sıkıntı olacaktır.SimaWB yazdı:ile foreing key'leri iptal edebilirsin. Belki işine yarar.Kod: Tümünü seç
ALTER TABLE tablo_ismi NOCHECK CONSTRAINT ALL
-
- Üye
- Mesajlar: 31
- Kayıt: 04 Oca 2008 01:53
- Konum: Adana
Re: Delphi ile SQL Den Gelen Hatayı yakalama
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.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
- 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
Bu arada atlamışız ama hata mesajını yakalama konusuna gelinceBuradaki E.Message oluşan hata mesajını aynen verecektir.
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;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
-
- Üye
- Mesajlar: 31
- Kayıt: 04 Oca 2008 01:53
- Konum: Adana
Re: Delphi ile SQL Den Gelen Hatayı yakalama
sabanakman yazdı:Bu arada atlamışız ama hata mesajını yakalama konusuna gelinceBuradaki E.Message oluşan hata mesajını aynen verecektir.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;
