Id Değerini Almak-Scope Idendity
Merhaba arkadaşlar.Bu yazıda,bazen çok fazla ihtiyaç duyacağımız,tabloya kayıt ekledikten sonra o kaydın id değerini alma konusu anlatılacak.
Ne gerek var buna diye soranlar için biraz daha açayım.Tablonuza kayıt ekliyorsunuz ve tablonun bir primary key’i var.Ve kayıdı ekledikten sonra bu id değerine ihtiyacınız var.Şöyle bir senaryo olabilir mesela.İki tablonuz var.Görevler ve Görevliler adında.Ve Tabloları oluştururken ilişkileri belirtmediniz diyelim.Şimdi ortaya şöyle bir ihtiyaç çıktı.Görevler tablosuna bir kayıt girdiğinizde Görevliler tablosuna da girdiğiniz kayıtla ilişkili kayıtlar girmelisiniz.Her görevin bir görevlisi olur sonuçta değil mi?Neyse buraya takılmayalım.Yapacağımız şey görevi ekledikten sonra görevId’sini almak ve bu ID ile görevliler tablosunda bir kayıt oluşturmak.
Eklediğimiz kaydın Id’sini şu şekilde alabiliriz.
SET @GorevID = CAST(SCOPE_IDENTITY() AS INT)
Ben ekleme işlemini store procedure kullanarak yaptığım için procedure’üme bu kodu ekledim.
Procedure’üm şu şekilde arkadaşlar.
ALTER Procedure [dbo].[Sp_TiCKETAdd]
(
@tckt_id int,
@tckt_userno int,
@tckt_content nvarchar(500),
@tckt_lastuser int,
@tckt_isactive bit,
@tckt_deadline datetime,
@tckt_tickname nvarchar(50),
@msg int output
)
As
Begin
insert into dbo.TICKET (tck_CreateUserNo, tck_TicketContent, tck_LastUpdateUser, tck_Complate, tck_isActive,
tck_CreateDate, tck_DeadlineDate, tck_LastUpdate,tck_TicketName,tck_isSeen)
values
(
@tckt_userno,
@tckt_content,
@tckt_lastuser,
0,
@tckt_isactive,
getDate(),
@tckt_deadline,
getDate(),
@tckt_tickname,
0
)
SET @msg = CAST(SCOPE_IDENTITY() AS INT)
End
Bakın arkadaşlar burası önemli.Id değerini atadığım değişken bir output parametredir.Yani giriş parametresi değil çıkış değeri alıyo sadece.Procedure’ünüzü bu şekilde yaptığınız da sorunsuz çalışacaktır.
Peki ben procedure’ü kod tarafından nasıl çağırıcam?Bu makalenin amacının dışında ama yer verelim bu konuya da.Sonuçta hepsi birbiriyle bağlantılı.Yani ben okuyucu olsam hepsini görmek isterim J
Benim ekleme yapan bir fonksiyonum var.Bi model sınıfından parametre alıyor.Bunlara takılmanıza gerek yok.Kafanızı karıştırmasın yani.Tabloya insert edeceğim değerleri alıyorum sadece.
Public Function ProcAddTicket(newtick As ModelLibrary.ticketModel2) As Integer
Dim value As Integer
Using comm As New SqlCommand
comm.CommandType = CommandType.StoredProcedure
comm.CommandText = "[Sp_TiCKETAdd]"
Dim par_tckt_id As New SqlParameter("@tckt_id", newtick.tck_TicketId)
Dim par_tckt_userno As New SqlParameter("@tckt_userno", newtick.tck_CreateUserNo)
Dim par_tckt_content As New SqlParameter("@tckt_content", newtick.tck_TicketContent)
Dim par_tckt_lastuser As New SqlParameter("@tckt_lastuser", newtick.tck_LastUpdateUser)
Dim par_tckt_isrepeat As New SqlParameter("@tckt_isactive", newtick.tck_isActive)
Dim par_tckt_deadline As New SqlParameter("@tckt_deadline", newtick.tck_DeadlineDate)
Dim par_tckt_name As New SqlParameter("@tckt_tickname", newtick.tck_TicketName)
Dim parmsg As New SqlParameter("@msg", SqlDbType.Int)
parmsg.Direction = ParameterDirection.Output
comm.Parameters.Add(par_tckt_id)
comm.Parameters.Add(par_tckt_userno)
comm.Parameters.Add(par_tckt_content)
comm.Parameters.Add(par_tckt_lastuser)
comm.Parameters.Add(par_tckt_isrepeat)
comm.Parameters.Add(par_tckt_deadline)
comm.Parameters.Add(par_tckt_name)
comm.Parameters.Add(parmsg)
mssql.InsertQuery(comm)
value = parmsg.Value
End Using
Return value
End Function
Arkadaşlar burda yaptıklarımızı özetlemek istiyorum.
Dim parmsg As New SqlParameter("@msg", SqlDbType.Int)
Önce SqlParameter ekliyoruz.Parametre ve datatype veriyoruz içine.Burda ki “msg” adlı parametre sql tarafında yazdığınız parametreyle aynı olmak zorunda arkadaşlar.Hata alabilirsiniz sonra.Ben sürekli alıyorumDikkatli olmak şart.Bu aşamada bi hata alırsanız önce parametrenizi kontrol edin.
parmsg.Direction = ParameterDirection.Output =>Parametremizin Output olacağını belirtiyoruz.
mssql.InsertQuery(comm) => Sorgumuzu excute ediyoruz.
value = parmsg.Value => Geri dönen değeri değişkene atıyoruz.
InsertQuery(comm) da ne şimdi? DiyebilirsinizJ
Public Function InsertQuery(ByVal CommObj As SqlCommand) As Object
Dim result As Object
Using conn As New SqlConnection(ConnectionString)
CommObj.Connection = conn
conn.Open()
result = CommObj.ExecuteNonQuery()
conn.Close()
conn.Dispose()
End Using
Return result
End Function
İşte bu kadar arkadaşlar.Nerden başladık nerelere girdik.Konu biraz dağıldı ama yapacak bişey yokJ
İyi Çalışmalar herkese.