MSSQL VE ADO GUNCELLEME

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

Merhaba arkadaslar
Delphide çalıstıgım projelerın hepsınde yasadgım bir sorunum var ado ve mssql ile ilgili.

verıtabanımda joinli viewlerim var.(left,right ve outer join li).
bu viewlerin update,insert,delete işlemleri için triggeları var.
bir procedure içinden viewden çağrım yapiyorum.(veritabanı ıcındekı procedure)

gelelim delphi tarafına. adostoredproc ile parametre yardımıyla procedureyi çagrıyorum.
fakat guncelleme yapmaya kalktıgım zaman satır bulunamadı vs hatası verıyor.
primary anahtar var. ado.properties["unique table"] vs yazıyorum olmuyor.

Eğer viewin triggeri devreye girse bır sorun olmayacak.Çünkü update,insert,delete işlemleri yapcak.
ama triggerden once ado'ya ne oluyorsa dedigım hataları verıyor. adoyu atlatıp trıggerı nasıl devreye sokarım.
yada baska bır cozumu varmı?

birseyler ters. yıllardır projelerımde bu sorunu asamıyorum. farklı ve uzun cozumler uretmek zorunda kalıyorum.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen thelvaci »

Trigger'larınızı view'ler üzerine değil gerçek tablolar üzerine yazarsanız bu tarz garipliklerle karşılaşmazsınız. View'ler eğer kullanıcı güvenliğini Sql Server üzerinde açtığınız loginler ile sağlamıyor iseniz tamamen gereksizdir. Tavsiyem; her bir tablo için Browse, Insert, Update ve Delete olmak üzere birer adet stored procedure yazmanız; gerekiyor ise tablonuza instead of ve after triggerları yazmanız. Bunları yapın, başınız ağrımasın, rahatınıza bakın.
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

trigger'i viewe yazmamın amacı hangi sutunda işlem yapılıyorsa ait oldugu gercek tabloyu guncellemek.(viewde bir kac join tablo var).
Kullanıcı bırkac tablodan bırlesmis verıyı gormek zorunda.
bu iş "ems sql manager" programında düzgün oluyor. yani data gridde veride değişiklik yapıyorum. trigger devreye gırıyor ve gercek tabloya (hagısıyse) yansitiyor.
ama delphide ado ile bağlanıp cxgrid ile veri değiştireyım dıyorum guncelleme hatası yapıyor.
Eger tam alorak acıklayıcı olamıyorsam ornek kodlar gonderebılırım.
gercekten yardıma ıhtıyacım var epey zorlandım.
Tesekkurler ilginize.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen thelvaci »

Birden fazla tablodan veri elde etmek için illa view'e ihtiyacınız yok ki; bunu stored procedure'ler ile çok rahat yaparsınız. View'ler pek işe yaramadıkları gibi aynı zamanda tehlikelidirlerde. View'den çektiğiniz dataset üzerinden yapacağınız güncelleme, silme gibi işlemler bağlı olduğu tabloları da etkileyecektir. Bu aslında bir dizayn problemi. Bu bağlamda her bir tablo için 4 ayrı sp önermiştim. Hangi tabloda ne yapacaksanız bu sp'leri çağırmalısınız. Bir kere alışırsanız ondan sonrası gelir ve asla sorun ve sıkıntı ile karşılaşmaş güle oynaya ilerlersiniz. 20 senenin getirdiği tecrübe ile söylüyorum, isterseniz kendi bildiğiniz istikamette de devam edebilirsiniz elbette.

Ben bu tarz işler için kullandığım yapıdan biraz bahsedeyim. Tüm kontrol benim elimdedir, her tablomun en az 4 adet sp'si olur; gerekiyor ise tablolarımın instead of ve after triggerlarıda olur. Kullanıcının manipüle edeceği dataları ilgili sp vasıtası ile çeker bir memory dataset içine aktarırım. Kullanıcı bu tablo ile haşır neşir olur. Kaydetmek istediği zaman ise; memory dataset üzerinden ilgili sp'lerimi çağırırım ve işlem tamamlanmış olur. Tercih sizin tabii.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen sabanakman »

SQL Server, bir sorguyu çalıştırırken etkilenen kayıt sayısını da hesaplamaktadır. Bunu devre dışı bırakmak derdinize çare olur mu bilemem ama "Trigger"ları aşağıdaki şekilde kodlarım genelde.

Kod: Tümünü seç

ALTER TRIGGER [dbo].[tbl] ON [dbo].[tbl_trigger]
For INSERT as
BEGIN
  set nocount on
..
..
..
  set nocount off
END
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

Tugrul bey sizin yontem gayet guzel hosuma gıttı. biraz uzun yol ama cok kullanıslı gorunuyor. projemın basında olsam uygulardım. su an 60 tablom var her bırıne 4 sp yazarsam yaz gelır işten atarlar:) ama mutlaka sonrakı projelerde deneyecegım onerınız ıcın tesekkur ederım. su an ıcın mevcut halıme bır care bulmalıyım.
Aslında sızın yontemle ortak bır yön var. sızın sp lerin yaptıgı ısler ıcın ben vıewe 3 adet ınstead of trıgger (update,ınsert,delete) yazıyorum. gercek tablolara boyle yansıtıyorum.
Ado "anahtar sutun bilgileri yetersiz hatası verıyor". halbuki işi triggera bıraksa sorun olmayacak. sanki işlemi viewe değilde, direk base tablolara uygulamaya calısıyor gibi. mantıgı bır turlu cozemedım bıraz derın mezvuya benzıyor.

Şaban bey dedğiniz satırları kullanıyorum. Sorun galiba baska. nasıl cozecegım bılmıyorum. acaba kımse bu sorunu yasamıyormu hep benımmı basıma gelıyor boyle seyler:))

Onerılerı beklıyorum arkadaslar bu ado'nun prensıbını cozelım
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

Arkadaslar yogun ugraslardan sonra bıraz yol katettım. söyleki;
sp içersinden viewi yalın cağırırsam (yanı sp içinde viewe birsey joinlemezsem) bir sorun cıkmadıgını gordum.

ama sp içersinde vieve ek join yapmam gerekli. bu durumda "anahtar sutun bilgileri yetersiz" hatası alıyorum.

kısacası sp içerside left,right,outer join kullanıldıgında satır guncelleme hatası alınıyor.

bundan sonrası ıcın fıkrı olan arkadasların goruslerını bılmek ısterım
tesekkurler
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen sabanakman »

terazi125 yazdı:..."anahtar sutun bilgileri yetersiz" hatası...
na göre sanırım join sorgu sonucuna gelen alanlar kısıtlı sayıda olduğu için, değişen kayıtlar neticesinde hangi satırların etkilendiğini sistem çözemiyor olabilir. Sorgudan meydana gelen alanlar arasına ilgili tabloların benzersiz ID alanlarını da eklemek belki işe yarayabilir. Bir de, (gerçi test edemeden tahmini yazıyorum ama) satır sayıları olarak birden - çoğa ilişki kuran join bir sorguda tek satır kalan ana tabloda değişiklik meydana geliyor ise bu hata geliyor olabilir :D .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

view üzerinde bir timestamp alan olustrudum (benzersiz sutun olusması çin).

Kod: Tümünü seç

CREATE VIEW dbo.vMalzemeAylikDevir
WITH VIEW_METADATA
AS
Select cast(CHECKSUM(i.Malzemeid,i.Yil,i.Ay) as timestamp) as tstmp,
......,
FROM dbo.vMalzemeAylik i
sp içersinden viewi baska bir tablo ile joinleyerek çağrdim,

Kod: Tümünü seç

CREATE PROCEDURE dbo.MAlzemeDurum
AS
BEGIN
  SET NOCOUNT ON;
  SELECT v.*,
         m.Malzemeid as mmmalzemeid /*ikinci tablonun bensersiz anahtarı*/
         
  FROM vMalzemeAylikDevir v 
  JOIN tblMalzeme m ON m.Malzemeid=v.Malzemeid
  WHERE v.Yil=2015 AND
        v.Ay=12     
  SET NOCOUNT OFF;
END
delphi kısmında şu kodu ekledım

Kod: Tümünü seç

procedure TForm1.ADOStoredProc1AfterOpen(DataSet: TDataSet);
begin
 ADOStoredProc1.Properties['Unique Table'].Value:='vMalzemeAylikDevir'; //bu view'im
 ADOStoredProc1.Properties['Update Criteria'].Value:=adCriteriaTimeStamp;
end;
yine aynı hata "Güncelleştirme veya yenileme için anahtar sutun bilgileri yetersiz".
Bu işte bir bit yeniği var ne belaya kaldım yav:)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen thelvaci »

Biryerlerde bir şeyleri ciddi anlamda hatalı yaptığınızı düşünüyorum. Hiç bir zaman hiç bir şey için geç değildir. Projenin hangi aşamasında olursanız olun; doğru bir yol ve yöntem keşfetti iseniz; hataları bertaraf edip o yönteme geçmelisiniz. İleride başınız ağrısın istemiyorsanız tabi.. Neden hâla view kullanmakta ısrar ediyorsunuz bilemiyorum ama son mesajlarınızda sp kullanmaya başlamışsınız. Asıl sorun şu; datayı client tarafa nasıl çekerseniz çekin; çektiğiniz dataset üzerinden güncelleme yapmaya kalkarsanız karşılaştığınız sorunlara benzer sorunlar ile karşılaşabilirsiniz. Sizin senaryoda veriyi çektiğiniz view üzerinden bir güncelleme yada silme yapmaya çalıştığınız için ve veri de birden fazla tablo üzerinden geldiğine göre SQL Server doğal olarak ilgili işlemi (update, delete) bağlı olan tüm tablolara yansıtmaya çalışıyor. En basit anlamda; veri çektiğiniz dataset'i bir memory dataset'e bağlayıp yaptığınız işlemleri onun üzerinden yapıp ardından da anlamlı stored procedure'lere parametre geçerek ilgili update ve delete sp'lerini siz tetikleyebilirsiniz.

Ayrıca; neden Properties'i kullandığınızı da anlayamadım. Properties değil Parameters kullanmalısınız...
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

Tuğrul bey SP leri her zaman kullanıyorum önceki msjlarda belirtmemisim. Sp lere parametre vererek view sorguluyorum. Viewleri kullanmanın amacı tablolarim birbiriyle çok fazla ilişkisel halde ve birbirleriyle hesaplanmis veriler olusturuyorlar. ayrica 120 civarında Sp var. Hepsinde tekrarlı tekrarlı kod yerine viewlerden sorgu yapıyorum. Bazen çoklu bir join işinden sadece hesaplanmis bir sütun lazım olabiliyor. Viewler hazırda yukten kurtarıyor. Update insert güncelleme işi için instead of triggeri sadece yazdığım kodları devreye sokuyor. Yani instead of triggeri olduğu surece SQL server hiç bir tabloya kendi yansıtma yapmaya kalkmıyor. Sizin yöntemi kullanmak isterim ama su ana databesim çok kompozit yapıda düzenlemek aylarimi alır. Sistemde onlarca kullanıcı var aksaklıklarda cabası.yarın Bir database örneği linki koyacağım eğer indirip sizde bu soruna bir bakabilirsiniz çok sevinirim. Birlikten kuvvet doğar demiş atalarımız;) Tesekkurler ilginize
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME-

Mesaj gönderen terazi125 »

Merhaba arkadaslar veritabanı ornegı lınkını ekliyorum.içinde 2 adet sp var. ilki delphi tarafında guncelleme hatası verıyor. ıkıncısı vermıyor.
aralarında hıcbır fark yok gıbı ama sebebını bulamaıyorum. 2. cısının calısması ıcın bır yol olmalı uzman arakdaslardan yardım ıstıyorum.

Kod: Tümünü seç

https://drive.google.com/file/d/0B_BVTzCUcpdPSkkydDk4aElLOUk/view?usp=sharing
terazi125
Üye
Mesajlar: 15
Kayıt: 04 Ara 2010 11:48

Re: MSSQL VE ADO GUNCELLEME

Mesaj gönderen terazi125 »

Merhaba arkadaslar,

konuyu tartştık ama bana uygun bir çözum bulamadım. yenı okuyanların kafası karısmasın dıye konuyu ozetleyerek tekrar sormak istiyorum.
Buna çözüm bulan arkadasa 50 tl gonderıyorum ciddiyim:))

Mssql verıtabanımda bir viewlim var. update,insert,delete işlemlerini instead of triggeri yapıyor.

Bİr sp içersinde viewe bir baska bir tablo joinliyorum. Delphiden Adostoredproc ile bağlanıp işlem yapmaya kalkıyorum ama "anahtar sutun bilgileri yetersiz" hatası alıyorum.

Eğer sp içersinden viewi yalın çağırırsam (yanı sp içinde viewe baska birsey joinlemeden) işlemlerim gercekleşiyor herhangi bir sorun olmuyor.(instead of triggerlar devreye giriyor).

Fakat benim sp içersinde viewi baska bir tablo joinlemem gerekli. Bu hatayı nasıl önlerim.

Aşagıda örnek database var. içinde 2 adet sp var deneyebılırsınız

Kod: Tümünü seç

https://drive.google.com/file/d/0B_BVTzCUcpdPSkkydDk4aElLOUk/view?usp=sharing
Cevapla