Yeni oluşacak kaydın oluşmadan verilecek id isini bulabilirmiyiz.
Bunu nicin soruyorum bir master ve buna bağlı detayları var ve kullanıcı kayıt eklerken master oluştururken detaylarıda tek tuşla insert etmek istiyor bunun en basit yolu sanırım alana atanacak indexlenen id iyi önceden bulmak olur die düşündüm fikirleriniz nelerdir?
Not:Firebird yada oracle olsaydı Generatorden son noyu alıp generatoru bir artırıp noyu manuel koyaardım ama mssql biraz garip yoksa varda benmi bilmiyorum
Hüseyin logoda yaptıkları gibi id numaralarını autoinc yapmak yerine bir tabloda tutarak sen artırabilirsin. Bu şekilde tablodan bilgiyi okur bir artırır ve yeni değeri yazarsın. Böylece hangi numarayı kullanacağını da tabloya kaydetmeden önce bilmiş olursun.
Çalışan bir sistemde bu yapılandırmayı yapmam projeyi yeniden yazmak gibi evet oda benim aklıma geldi açıkcası ama bu autoincrement in attığı numraya ulaşmak mümkün olsaydı işim basit olurdu :S
Merhaba,
Ben ilgili tabloya fazladan birde GUID adında alan tanımlıyorum kayıdı Commit ederken oluşturduğum GUID i bu alana yazıyorum sonra bu GUID le o kayıdı çağırıp ID yi alıyorum, farklı yöntemlerde kullanmıştım örneğin giridğim kayıdın ayırı yani %100 tekil bir sahasını kullanmak gibi ama nadirenden olsa sorunlar yaşadım bence en iyisi GUID gibi uzunca random bir veriyi kullanmak.
İyi çalışamalar.
Bu kod veri tabanına yazılan son değeri verir. Bunun bir fazlası tabloya yazılacak değerdir fakat çok önemli bir uyarı. Buradan okunan değer eğer tabloya hiç kayıt yazılmadıysa ( veya truncate table ile boşaltılmışsa) okunan değer 1 olacak ve yazılan değer de 1 olacaktır. İlk kayıt yapıldıktan sonra bu değer tekrar okunursa yine 1 değerini verecektir ama bir sonraki kayda 2 yazacaktır. Eğer tablo delete from veya dataset üzerinden delete metodu çalıştırılarak boşaltılmışsa bunun önemi yok okunan değerin 1 fazlası sonraki eklenen kayda yazacaktır. Sadece tablo ilk oluştuğunda boş olunca bu sorun oluşuyor. Benzeri bir sorunu bende yaşamıştım ve tabloya 1 kayıt ekleyip sildikten sonra değeri istediğim gibi kontrol altında tutabildim.
İleride toparlayabilirsem AutoInc alanlar için değişik (değer okuma, bizim verdiğimiz değeri yazma, alan çevirme vs.) ihtiyaçları karşılayacak bir makale yazmaya hazırlanıyorum.
En son sabanakman tarafından 22 May 2007 10:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Şaban Şahin AKMAN
_________________ Derin olan kuyu değil kısa olan iptir. - .
s.a.
Verdiğiniz bilgi için teşekkür ederim peki aklıma takılan konu şu 3000 kişi userlı bir ortamda alacağım id iyi bloke etme olasılığım varmı? çünkü aynı anda birden fazla user ın post etme olasılığı oluşabilir yani kalıcı autoincrementi artırmak gibi kayıt olmadan
s.a.
Bu işi Logo iyi yapmış. Her tablonun bir StoredProcedure u var. Kayıt oluşturmadan önce o SP den sıradaki numarayı alıyor, numarayı aldıktan sonra o numarayı kullanarak işlem yapıyor.
Logo belki araştırmadı belki de basitine geldi Oracle de yada Firebird de olsa bu kadar canbazlığada gerek yok ama işte mssql gerçi belki yolu vardır ama id tabloları oluşturmak bence çok ta mantıklı değil basitlik dışında bu olanağı bana Mssql sunmalı yoksa kötü reklam yapacam
Hüseyin kardeş bu işlemi bir tablo üzerinden yapacaksan sıradaki ID yi alıp gireceğin bilgiler için kullanabilirsin. Bu arada aldığın ID yı alır almaz bir arttırıp yerine yazmalısın ki senden sonra alacak kullanıcı ile çakışma olmasın. Her alacak olan alıp bir artıracak ve tabloya yazacak. Herhangi biri kayıtı tamamlamasa (vazgeçerse) alınan ID tablodakiID - 1 e eşit ise tablodakini bir azaltabilirsin. Bu şekilde çok fazla boşluk olmasını da önleyebilirsin
MS-SQL Server'ın sistem tablolarından/viewlarından veya master VT'sinden birçok bilgiye ulaşabiliyorsunuz. Eğer kastınız bir tablonun IDENTITY alanının en son aldığı değeri bulmak ise (ister o kayıt mevcut olsun ister silinmiş olsun) yapmanız gereken sys.identity_columns ve sys.all_objects adlı tablolardan (alternatifleri de var) yararlanmak:
Benim kullandığım şekilde 90 kullanıcılı bir sistemde hiç çakışma olmadan işler yürüyor. Detay tablonun BeforePost olayına Master.CheckBrowseMode deyince henüz kaydedilmeyen master tablosunun kaydından sonra detayı kaydettiriyorum, ki detayın masterID si null olmasın.