MSSQL VE ADO GUNCELLEME
MSSQL VE ADO GUNCELLEME
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.
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.
Re: MSSQL VE ADO GUNCELLEME
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.
Re: MSSQL VE ADO GUNCELLEME
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.
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.
Re: MSSQL VE ADO GUNCELLEME
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.
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.
- 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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: MSSQL VE ADO GUNCELLEME
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
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
Re: MSSQL VE ADO GUNCELLEME
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
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
- 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
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 .terazi125 yazdı:..."anahtar sutun bilgileri yetersiz" hatası...
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: MSSQL VE ADO GUNCELLEME
view üzerinde bir timestamp alan olustrudum (benzersiz sutun olusması çin).
sp içersinden viewi baska bir tablo ile joinleyerek çağrdim,
delphi kısmında şu kodu ekledım
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:)
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
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
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;
Bu işte bir bit yeniği var ne belaya kaldım yav:)
Re: MSSQL VE ADO GUNCELLEME
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...
Ayrıca; neden Properties'i kullandığınızı da anlayamadım. Properties değil Parameters kullanmalısınız...
Re: MSSQL VE ADO GUNCELLEME
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
Re: MSSQL VE ADO GUNCELLEME-
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.
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
Re: MSSQL VE ADO GUNCELLEME
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
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