ورود

View Full Version : سوال: آخرین فیلد کلید درج شده Identity



abdonsd
شنبه 23 آبان 1388, 10:55 صبح
سلام

من یک جدول دارم که این جدول دارای 3 فیلد id, fname, lname هست و فیلد id از نوع int و primary key و identity است. و فرمی که به sqldatasorse وصل شده فقط دارای دو textbox برای ورود fname و lname است. یعنی موقع insert کردن id رکورد جدید رو خود sqlserver اضاف میکنه

حالا سوالم اینه که وقتی کنترل sqldatasourse یک رکورد جدید رو وارد این جدول میکنه، چطور میشه فهمید id این رکورد جدید اضافه شده چیه؟



میخام این id رو تو همین صفحه بدست بیارم برا اینکه میخام ازش برای ورود در یک جدول دیگه استفاده کنم

لطفا راهنماییم کنید



(توی mysql آخرین id ]–فیلد کلید-[ اضافه شده در یک جدول رو با دستور mysql_insert_id(); میشه بدست اورد. میخام همین کار رو با sqlserver و asp.net انجام بدم)

raziee
شنبه 23 آبان 1388, 11:20 صبح
SELECT MAX(ID) AS Max
FROM YourTable
اما با این چیزی که گفتی میتونی اطلاعات دو تا جدولت رو بفرستی به بانک و در بانکت یه تریگر بنویسی و اون جا این کارا رو بکنی که اطلاعات کمتر رد و بدل بشه.
به این نگاه کن:
http://barnamenevis.org/forum/showthread.php?t=167785

mehdi.mousavi
شنبه 23 آبان 1388, 11:29 صبح
حالا سوالم اینه که وقتی کنترل sqldatasourse یک رکورد جدید رو وارد این جدول میکنه، چطور میشه فهمید id این رکورد جدید اضافه شده چیه؟

سلام.
شما می تونید با این روش (http://blog.developers.ie/cgreen/archive/2007/08/20/sqldatasource-getting-identity-after-insert.aspx) ID تولید شده رو بدست بیارید.

موفق باشید.

ویرایش: در لینکی که ارسال کردم، نویسنده مطلب از @@IDENTITY برای گرفتن ID آخرین رکورد اضافه شده با بانک استفاده کرده و من مطلقا حواسم به این موضوع نبود. این کار اشتباه هستش و باید از SCOPE_IDENTITY() برای گرفتن ID استفاده کرد. (توضیح تفاوت این دو از حوصله این تاپیک خارجه). جدا از این مساله، روش توضیح داده شده در اون لینک کاملا ایمن هستش.

golagha_program
شنبه 23 آبان 1388, 11:32 صبح
توي sp بعد از نوشتن دستور insert براي برگرداندن كد id بنويس


select IDENT_CURRENT('YourTebleName')

ali.akhbary
شنبه 23 آبان 1388, 13:39 عصر
كلا سه تا روش داريم:

IDENT_CURRENT returns the last identity value generated for a specific table in any session and any scope.

@@IDENTITY returns the last identity value generated for any table in the current session, across all scopes.

SCOPE_IDENTITY returns the last identity value generated for any table in the current session and the current scope.

http://msdn.microsoft.com/en-us/library/ms175098.aspx

A.S.Roma
یک شنبه 24 آبان 1388, 16:54 عصر
این روش ها به مشکل همزمانی برنمی خورن ؟!
مثلا" دو نفر همزمان Insert کردن اونوقت Id هاشون تداخل با هم پیدا نمی کنن !؟

ali.akhbary
یک شنبه 24 آبان 1388, 17:16 عصر
این روش ها به مشکل همزمانی برنمی خورن ؟!
مثلا" دو نفر همزمان Insert کردن اونوقت Id هاشون تداخل با هم پیدا نمی کنن !؟

ببين دوست من، اون سه مورد بالا تا يه جاهايي كمكت مي كنند و مي توني خيلي كارها رو انجام بدي ولي اگه فكر مي كني بعضي جاها براي گرفتن آيدي به مشكل بر مي خوري، ...
قبل از Insert و بعد از select scope_identity() يه دستور GO اضافه كن. اين باعث ميشه كه بعد از Insert كردن شما تا قبل از اينكه ID رو برنداشتي هيچ كسي نتونه هيچ دستوري رو اجرا كنه.




go
insert value
select scope_identity()
go

Ebrahim Asadi
یک شنبه 24 آبان 1388, 19:06 عصر
[quote=raziee;847481]
SELECT MAX(ID) AS Max
FROM YourTable

اين روش استانداردي براي به دست آوردن آخرين Identity جدول نيست. چون ممكنه در فاصله بين دستور Insert و دستور Select MAX(ID جندين ركورد ديگه هم به جدول Insert شده باشه. با اين روش هميشه آخرين ID كه ايجاد شده است را خواهيد داشت نه ID ركودي كه خودتان Insert كرده ايد.
روش صحيحش همونه كه دوستمون ali.akhbary گفتند. بعد از Insert كردن دستور SCOP_IDENTITY رو اجرا كن. اين دستور آخرين Identity ايجاد شده در يك stored procedure، Trigger يا function را بر مي گرداند.


INSERT INTO Table1 Values("...")
SELECT SCOPE_IDENTITY() AS Last_Id

raziee
سه شنبه 26 آبان 1388, 18:22 عصر
حالا بعد از Insert میشه بگید چه ج.ری میشه بهش دسترسی داشت؟
در sp که نوشتم scope_identity() رو برگشت میدم.
حالا گرید ویو رو با
ObjectDataSource وصل کردم ولی برای بازگشت دادن اون مقدار نمیدونم باید چه کار کنم!
در رویداد Inserted چه کدی رو باید بنویسم؟


string sID = e.ReturnValue.ToString();

این کد همیشه مقدار 1 رو میده.


string sID = e.OutputParameters["RETURN_VALUE"].ToString();

این کد هم خطا تولید میکنه.