logo
Welcome Guest! To enable all features please Giriş or Kayıt.

Bildirim

Icon
Error

Ayarlar
Son mesaja git Go to first unread
islambol  
#1 Gönderildi : 6 Aralık 2014 Cumartesi 10:43:51(UTC)
islambol

Sıralama: Member

Gruplar: Registered
Katılan: 27.08.2014(UTC)
Mesajlar: 11
Turkey
Konum: istanbul

2 Kere Teşekkür Etti.
3 Mesajına Toplam 4 Kere Teşekkür Edildi.
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.
Uğur Ada
Software Developer
https://ugurada.wordpress.com
thanks islambol: 1 Kişi mesajın için Teşekkür Etti.
diaboli 6.12.2014(UTC) tarihinde
mehmetzekikir  
#2 Gönderildi : 7 Aralık 2014 Pazar 15:37:50(UTC)
mehmetzekikir

Sıralama: Administration

Gruplar: Administrators
Katılan: 6.05.2014(UTC)
Mesajlar: 670

19 Kere Teşekkür Etti.
152 Mesajına Toplam 253 Kere Teşekkür Edildi.
Originally Posted by: islambol Go to Quoted Post
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.


Ellerine sağlık uğur
Sql Server 2016 Eğitimiz 19 Mayıs tarihinde başlayacaktır. 32 Saat Olup Ücret 1450 TL + KDV'dir. Kayıt ve ayrıntılar için tıklayınız

twitter.com/dbakademi
Dua ve teşekkür en büyük servetlere bedel...


Bu konudaki kullanıcılar
Guest (2)
Forumu Atla  
Bu foruma yeni konular postalayamazsınız.
Bu forumda ki konulara yeni posta gönderemezsiniz.
Bu forumdaki postalarınızı silemezsiniz.
Bu forumdaki postalarınızı düzenleyemezsiniz.
Bu forumda anketler yaratamazsınız.
Bu forumdaki anketlere oy veremezsiniz.