Son kaydın ID değerini alalım SCOPE_IDENTITY()

Tarih 19 Ocak 2010 Salı, 01:04 | Etiket(ler) Asp.Net, Sql ve Veritabanları, Visual Basic

Herhangi bir kayıt işleminde 2 tabloya triggersız kayıt girmek veya henüz girdiğimiz ID değerini kullanmak istediğimizde pek çoğumuz 2 ayrı sql cümlesi kullanırız. Aslında bu işlem için iki ayrı sql cümlesi yazıp işlem yapmak hem gereksiz kaynak tüketmeye hemde gereksiz kod kalabalığına neden olur. Böyle bir durumda SCOPE_IDENTITY() biçilmiş kaftan olarak karşımıza çıkar. Senaryo olarak tbl_sorular ve tbl_cevaplar adlarında iki tablomuzun olduğunu varsayalım. Adlarından anlaşılacağı gibi tbl_sorular tablomuza soruları, tbl_cevaplar tablomuza cevapları girmek istiyoruz. tbl_cevaplar tablosundaki cevapları, tbl_sorular tablosundaki soruyla eşleştirmek için SORUID değerine ihtiyacımız var ve her yeni kayıtta 3 sql cümlesine ihtiyacımız olacak (bu yazıdan sonra olmayacak) :

1) sorular tablosuna kayıt girmek için INSERT cümlesi
2) sorular tablosundaki son ID değeri için SELECT cümlesi
3) cevaplar tablosuna cevap girmek için INSERT cümlesi

Şimdi bu üç sorgu yerine çok daha az kodla ve kaynakla bu işlemleri yapmaya çalışacağız.

SQL Server tablo yapımız şu şekilde :
tbl_sorular tablomuz :

tbl_sorular

tbl_cevaplar tablomuz :

tbl_cevaplar

böyle bir durumda 3 sorgu yerine, 2 sorgu kullanıp kodumuzu optimize hale getiriyoruz. Bunun için aşağıdaki gibi bir kod bloğu kullanabilirsiniz.
' Veritabanı bağlantı satırımız
Dim Veritabani As New SqlConnection("SQL_BAGLANTI_SATIRIMIZ;")
' Birinci Sql cümlemizi yazacağımız SqlCommand ve parametreleri
Dim Sql1 As New SqlCommand
Sql1.CommandType = CommandType.Text
' Veritabanımızı SqlCommand'ımız ile ilişkilendirelim
Sql1.Connection = Veritabani
' Son ID değerimizi alabilmek için gerekli parametrelerimiz
Dim insertPrm As New SqlParameter
insertPrm.Direction = ParameterDirection.Output
' ID değerini istediğimiz alan
insertPrm.ParameterName = "SORUID"
insertPrm.Size = 10
Sql1.Parameters.Add(insertPrm)
' INSERT cümlemizi tanımlayalım, sihirli kelime SCOPE_IDENTITY() AS SORUID bize istediğimizi verecek
Sql1.CommandText = "INSERT INTO tbl_sorular (SORU) VALUES ('Sorumuz buraya gelsin'); SELECT SCOPE_IDENTITY() AS SORUID"
' Geri dönen değeri almak için tabiiki ExecuteScalar kullanmalıyız
Dim sonId As String = Sql1.ExecuteScalar

' Ve cevaplar tablomuza cevabımızı girelim
Dim Sql2 As New SqlCommand("INSERT INTO tbl_cevaplar (SORUID,CEVAP) VALUES (" & sonId & ",'Cevabım buraya gelsin');", Veritabani)
If Veritabani.State = ConnectionState.Closed Then Veritabani.Open()
Sql2.ExecuteNonQuery()
Veritabani.Close()
Dikkat ettiyseniz ilk tabloya eklediğimiz ID değerini ikinci bir sql cümlesi ve kaynağı kullanmadan ExecuteScalar ile geri döndürdük ve cevaplar tablomuza istediğimiz değeri yazdırdık. Son eklenen değeri ikinci bir cümleyle almak hatalara neden olabilirdi. O sırada başka bir kayıdın girilmesi yanlış ID değerine ulaşmamıza neden olabilir ve yukarıda anlattığım gibi gereksiz yük ve zaman kaybı olarak başımızı ağrıtabilirdi. Sihirli kelimemiz SCOPE_IDENTITY() son eklediğimiz kaydın ID değerini başarıyla geri döndürdü.

Yeri gelmişken @@IDENTITY veya IDENT_CURRENT() kelimeleri de aynı işi farklı yöntemlerle yapmamızı sağlayabilirdi. Yalnız unutmamalıyız ki @@IDENTITY tablomuzda trigger çalışıyorsa yanlış ID değerini geri döndürebilir. Aslında bu kadar basit. Yeni bir yazıda görüşmek üzere...



Yorumlar

Tarih 27 Mayıs 2011 Cuma, 12:28 | Yazan Cenk SARI

Sayfayı post etmeden verileri ancak querystring ile alabilirsiniz ki bu sağlıklı bir yöntem değil. Button'ın click olayını kullanmanız gerekir dolayısı ile postback her şekilde çalışmış olacak. Yapmak istediğiniz şeyi tam olarak anlayamadım açıkçası.Ajax'mı kullanmak istiyorsunuz acaba ?

Tarih 11 Nisan 2011 Pazartesi, 23:32 | Yazan can öztürk

hocam bır zıyaretcı sayfası yaptım ama bunu javascrıptle yapmam gerkeıyor... yanı sayfa postpack olmamalı elınızede buna daır bır kod varmı yanı asıl amacım su butona bsıldıdıgnda .cs sayfasında maıl fonksıyonu ve kaydetme ıslemı yapcak ... yardımcı olursanız sevınırım sanırsam sızınkı post pack yapıyor...
Yorum yazın

Capthca Karakterleri kutuya giriniz
Kodu değiştir...


Geri Dön   |   Ana Sayfaya Dön