Son kaydın ID değerini alalım SCOPE_IDENTITY()
Tarih 19 Ocak 2010 Salı | Etiket(ler) Asp.Net, Sql ve Veritabanları, Visual Basic | Yorumlar 2 yorum
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_cevaplar tablomuz :
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...
ExecuteScalar, ExecuteNonQuery ve ExecuteReader
Tarih 18 Ocak 2010 Pazartesi | Etiket(ler) Asp.Net, Visual Basic, Sql ve Veritabanları | Yorumlar 2 yorum
En çok sorulan sorulardan biri ExecuteScalar, ExecuteNonQuery ve ExecuteReader metodlarının ne işe yaradıkları ve birbirlerinden ne farklarının olduğudur. Asp.Net e yeni başlayanların kafasını kurcalayan bu konuyu sade ve yalın olarak, çok fazla teknik cümleler kurmadan basit bir şekilde anlatmaya çalışacağım. Herbirinin kullanım alanlarının farklı olduğunu söylemekle başlayalım.
ExecuteScalar :
Geriye object tipinde değer döndüren bu alan, aynı zamanda geriye tek bir değer döndürür. Gönderilen SQL sorgusunda geriye ne kadar satır veya sütun dönerse dönsün sadece ilk satırın ilk sütunu sonuç olarak alınabilir. Genelde SUM, COUNT, AVG, MAX, MIN vs. gibi tek veri istenilen sorgularda kullanılır. Ya da veritabanında kayıtlı olan bir kaydın kontrol edilebilmesi için uyarlanabilir. Örneğimize geçelim.
Dim Veritabani As New SqlConnection("server=SERVER;database=ORNEKDB;user=USER;password=PASS;")
Dim Sql As New SqlCommand("SELECT COUNT(ID) FROM tablo_adi;", Veritabani)
Try
Veritabani.Open()
' lblSonuc isimli label a tablo_adi tablosunda kaç kayıt olduğunu yazdırıyoruz
lblSonuc.Text = Sql.ExecuteScalar.ToString
Catch ex As Exception
Response.Write(ex.Message)
Finally
Veritabani.Close()
End Try
ExecuteNonQuery :
Geriye Integer olarak DELETE, INSERT, UPDATE komutları sonucu kaç kayıdın etkilendiği döndürüyor. Diğer bir deyişle DELETE sql komutunu kullandığınızda kaç kayıt silindiğini, INSERT komutunu kullandığınızda kaç kayıt eklendiğini, UPDATE komutunu kullandığınızda kaç kayıdın güncellendiğini söylüyor. Veritabanı üzerinde kayıtlar ile ilgili değişiklik yapacağımız zaman bu metodu kullanıyoruz. Örnek verirsek.
Dim Veritabani As New SqlConnection("server=SERVER;database=ORNEKDB;user=USER;password=PASS;")
Dim Sql As New SqlCommand("UPDATE tablo_adi SET SAYI = 1;", Veritabani)
Try
Veritabani.Open()
' lblSonuc isimli label a tablo_adi tablosunda kaç kayıt değiştiğini yazıyoruz
Dim sonuc As Integer = Sql.ExecuteNonQuery
If sonuc > 0 Then
lblSonuc.Text = sonuc.ToString
Else
lblSonuc.Text = "Hiçbir kayıt düzenlenmedi"
End If
Catch ex As Exception
Response.Write(ex.Message)
Finally
Veritabani.Close()
End Try
ExecuteReader :
Bir veritabanından SELECT sorgusu ile çektiğimiz kayıtların veri akışını sağlar. SELECT sql sorgusu sonucunda dönen kayıtların hepsini satır ve sütun bazında herhangi bir veri kaynağına aktarmamızı ya da direkt olarak basmamızı kolaylaştırır. Dönen sonuçlar SqlDataReader nesnesi üzerinden aktarılır.
Dim Veritabani As New SqlConnection("server=SERVER;database=ORNEKDB;user=USER;password=PASS;")
Dim Sql As New SqlCommand("SELECT * FROM tablo_adi;", Veritabani)
Try
Veritabani.Open()
Dim sonuclar As SqlDataReader = Sql.ExecuteReader
' Geri dönen tüm sonuçları ekrana bastırıyoruz.
While sonuclar.Read
Response.Write(sonuclar.Item("ADI"))
Response.Write(sonuclar.Item("SOYADI"))
End While
sonuclar.Close()
Catch ex As Exception
Response.Write(ex.Message)
Finally
Veritabani.Close()
End Try
Genel kullanım alanları basit olarak bu şekilde anlatılabilir. Umarım kafanızda soru işareti kalmamıştır. Tüm sorularınız için benimle iletişime geçebilirsiniz.
We're in this together, we share the same skin!