Yaptığım Son Kaydın PK Alanını Alma

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
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen seho »

Merhaba Arkadaşlar,

SQL Server 2008 Kullanmaktayım. Şöyle bir sorunum var : Form ekranında kayıt yaptıktan sonra işlemlere devam edeceğim. Bunun için de Master tabloda önce kaydı oluşturup PK alanını alıp, detail tablolarla ilişkili kayıtlar oluşturacağım. Sistem ağ üzerinde çalışacağından yapılan son kayıtın id si benim id im olmayabilir. MySQL de mysql_insert_id bu işi görüyordu ama SQL Server da karşılığını bulamadım.

İyi çalışmalar.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen aslangeri »

s.a.
insert komutunun hemen akabinde
select @@identity komutu ile son eklenen kaydın id sini alabilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen seho »

A.S.
İnsertin hemen arkasından çalıştırıyorum, fakat farklı bir query ile çalıştırmamın sakıncası olur mu? Program network üzerinde olacağından son kayıt benim kaydım olabilir. Benim isteğim benim eklediğim son kayıt olduğu için ayrı query lerde güvenirliği nedir acaba bu işlevin?
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: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen sabanakman »

Kod: Tümünü seç

ADO.Append;
ADO.Post;
ile kayıt yapılır ve post satırının hemen altında oluşan ID değeri de kullanılabilinir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen aslangeri »

s.a.
bir başka yöntemde insert ettiğiniz kaydı select etmeniz olabilir.
atıyorum fişnumarasından kayıt türünden vs. belli kriterlerle eklediğiniz kaydı seçebilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen thelvaci »

@@Identity biraz tehlikeli bir kullanıma sahip. Siz kayıt ekledikten kısa bir zaman sonra yani siz @@Identity'nin değerini select etmeden önce birisi kayıt girdi ise hatalı sonuçlarla karşılaşabilmeniz olası. Bu vesile ile; en güzeli girdiğiniz verilere göre unique olabilecek bir Select Max(Id) Where ... çağrımı olacak gibi görünüyor.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen vkamadan »

Merhaba yanlış hatırlamıyorsam tıpkı MySQL de olduğu gibi @@identity gibi komutlar thread isole olarak MSSQL'e açılan her bağlantı kanalı için ayrı takip ediyor olmalı yani örneğin projenizde bir tane TAdoConnection nesnesi kullandınız bu connection nesnesi üzerinde yaptığınız kayıtlar için @@identity sadece o kanal için yapılan en son otomatik artan alan değerini verir yani sorun çıkmaması gerekir, MSSQL hakkında çok bilgi sahibi değilim fakat şöyle bir mantıkta vardı sanırım örn "@" tek at kullanımı local yani sizin thread üzerindeki değişken değerine "@@" çift at ise ilgili değişken eğer destekliyorsa tüm threadler içinde yani global olarak değişken değerine erişim sağlıyordu, bu durumda siz @@identity yi tek @ ile @identity olarak kullanmanız gerekir. hatalarım varsa af ola. iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen Hakan Can »

Hocam, IDENT_CURRENT fonksiyonunu help'ten incelerseniz muhtemelen işinizi görür:

"IDENT_CURRENT( 'table_name' ), IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope."

Kod: Tümünü seç

SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
Kolay gelsin.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen thelvaci »

Arkadaşlar bu tarz durumları bence daha geniş düşünmek icap ediyor. Uygulama 3 katmanlı bir uygulama da olabilir. Bu gibi bir durumda genelde sadece bir tane connection üzerinden veritabanına ulaşırız yada aynı connection'ı paylaşan, connection bilgilerini bir havuzdan alan birden fazla kullanıcı olabilir. En makulü Select Max(Id).. Where gibi bir kullanım ama, ben riski severim diyorsanız seçim sizin tabii.
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: Yaptığım Son Kaydın PK Alanını Alma

Mesaj gönderen orhancc »

C# da linq ile kolayca yapabilirsin

Kod: Tümünü seç

public void LinqToSqlAdvanced05()
{
	Console.WriteLine("ContactID is marked as an identity column");
	dynamic con = new Contact {
		CompanyName = "New Era",
		Phone = "(123)-456-7890"
	};

	db.Contacts.Add(con);
	db.SubmitChanges();

	Console.WriteLine();
	Console.WriteLine("The ContactID of the new record is {0}", con.ContactID);

	cleanup130(con.ContactID);
}

Cevapla