ورود

View Full Version : نحوه استفاده از یک IDENTITY بعد از افزودن رکورد به جدول چیست؟



edisoon
سه شنبه 23 مهر 1387, 19:47 عصر
سلام دوستان،
من از یک Stored procedure استفاده میکنم که یک رکورد جدید رو به جدول من در بانک اطلاعاتی اضافه میکنه. بعد از اینکه این کار انجام گرفت Identity را Return میکنم.
حال سئوال من این است که وقتی با دستور ExecuteNonQuery این sp را صدا میزنم، بعد از اجرای sp چطوری میتونم از مقدار Identity جدید که توسط خودش Return شده استفاده کنم؟

اینم sp من


ALTER PROCEDURE dbo.sp_TblNames_Insert
@PID int,
@FName nvarchar(20),
@LName nvarchar(30),
As
Begin
Insert Into TblNames
([FName],[LName])
Values
(@FName,@LName)

Declare @ReferenceID int
Select @ReferenceID = @@IDENTITY

Return @ReferenceID
End

من میتونم بعد از اینکه رکورد اضافه شد توسط ExecuteScalar آنرا بدست آورم ولی سئوالم این است که آیا با اجرای یک sp که عملیات Insert را انجام میدهد میتوان خروجی Identity را نیز دریافت کرد و استفاده نمود یا خیر. اگر میشود چگونه؟

من این دو کار را با یک Sp و توسط دستور ExecuteScalar انجام میدهم آیا این روش درست است؟


ALTER PROCEDURE dbo.sp_TblNames_Insert
@PID int,
@FName nvarchar(20),
@LName nvarchar(30),
As
Begin
Insert Into TblNames
([FName],[LName])
Values
(@FName,@LName)

Select Max(PID) from tblNames
End

rooshan2008
سه شنبه 23 مهر 1387, 23:05 عصر
سلام به دوست عزیز
من این روش بلد هستم

کد Store Procedure تقریباً درسته ولی من اینتوری اصلاحش کردم:




ALTER PROCEDURE dbo.sp_TblNames_Insert
@FName nvarchar(20),
@LName nvarchar(30)
As
Insert Into TblNames
([FName],[LName])
Values
(@FName,@LName)
select 'Ret' = @@IDENTITY


سلام توکدی که شما نوشه بودین نیازی نیست فیلدی که از نوع IDENTITY هست رو براش پارامتر در نظر بگیرین...

حالا برای برگشت توی Vb.net:






Dim Connecting As New System.Data.SqlClient.SqlConnection
Dim Command1 As New SqlClient.SqlCommand
Dim DataTable_1 As New DataTable
Dim DataAdapter_1 As New SqlClient.SqlDataAdapter
Connecting.ConnectionString = Con_String()
Connecting.Open()
Command1.Connection = Connecting
Command1.CommandText = "sp_TblNames_Insert 'roshan','Program_vb2006'"

DataAdapter_1.SelectCommand = Command1
DataAdapter_1.Fill(DataTable_1)
''''''return IDENTITY

Dim result = DataTable_1.Rows(0)(0) 'record 1 Column 1

MsgBox(result)


بااین کار من دستور رو اجرا کردم و جواب رو داخل شی از نوع DataTable به نام DataTable_1 ریختم که همون مقدار IDENTITY هست

البته روش تابع هم میشه اگه این Ok شد بهت می گم چون الان یکم کار دارم...
کد دومی خودت هم درسته .درصورتی که همین جوری داخل پروسیجر باشه اگه Select رو جدا اجرا کنی مشکل داره چون اون وقت اگه آخرین رکورد پاک بشه مقدار بعدی ایدی رو نمی تونی پیدا کنی ....OK


امید وارم کمکت کرده باشم..

edisoon
چهارشنبه 24 مهر 1387, 01:00 صبح
نه عزیز، نتونستی کمکی بکنی، من دنبال یک کار منطقی تری میگردم.
اگه بخوام با یک DataTable خروجی رو بگیرم که کاری نداشت برام.
من با همون ExecuteScalar بدون نیاز به DataTable هم رکورد جدید رو اضافه میکردم و هم خروجی رو میگیرم دیگه این چه کاریه که Return Value رو بریزم توی یک DataTable ؟

اساتید یه نگاهی بندازن و راهنمایی کنن.

Chabok
چهارشنبه 24 مهر 1387, 08:21 صبح
با سلام .

میتونید توی SP بعد از اینسرت بنویسید :
Select @@Identity

و با اجرای ExecuteScalar هم دستور اینسرت اجرا میشه و هم خروجی این متد همون آی دی جدید است .
این روش کار میده و مشکلی از نظر فنی نداره .

روش دیگه استفاده از پارامتر Output است که در SP به این صورت تعریف می شود :

@ID int output

...

Set @ID = @@Identity
و در پارامترهای شی کامند به این صورت تعریف میشود :

Cmd.Parameters.AddWithValue("@ID",0);
Cmd.Parameters["@ID"].Direction = ParameterDirection.InputOutput;البته فقط Output هم میتونید تعریف کنید .

و پس از اجرای کامند توسط ExecNonQuery و یا ExecScalar به این صورت کد جدید رو بدست آورید :

ID = (int)Cmd.Parameters["@ID"].Value;دیگه خودتون ببینید با کدوم یکی حال میکنید .
موفق باشید . خدانگهدار

Microsoft.net
چهارشنبه 24 مهر 1387, 09:46 صبح
هميشه مقدار Return شده از stp رو ميشه با دستور



YourCommand.parameter("@Return_Value").Value


بدست آورد ؛ اين پارامتر به صورت پيش فرض توليد ميشه و اسمش رزرو شده است