PDA

View Full Version : به دست آوردن آی دی آخرین رکورد ثبت شده در دیتا بیس



farzaneh_bala
چهارشنبه 25 دی 1392, 22:44 عصر
با سلام
دوستان من میخوام آی دی آخرین رکورد ثبت شده در جدولم رو به دست بیارم.زبان برنامه نویسی که استفاده میکنمASPهست و ارتباط از طریق LINQ انجام شده.(ستون ID به صورت خودکار مقدار دهی میشه.یعنی به ازای هر رکورد یک واحد به آن اضافه میشود!)
خواهشا کمک کنید...

mamad174
پنج شنبه 26 دی 1392, 07:37 صبح
سلام کلا برای پیدا کردن آخرین رکورد باید اینطور عمل بشه به طور مثال من می خوام آی دی آخرین رکورد رو داخل یک لیبل نشون بدم


label1.text=dt.rows[dt.rows.count-1]["نام فیلد"]

البته این LINQ نیست ولی در کل این طور میشه که داخل قسمت اول دیتا تیبل که شماره سطر رو باید قرار بدی شما به جای شماره سطر تعداد رکوردها -1 رو قرار بده میبینی به آخرین رکورد جدول اشاره میکنه موفق باشی

farzaneh_bala
پنج شنبه 26 دی 1392, 10:55 صبح
سلام کلا برای پیدا کردن آخرین رکورد باید اینطور عمل بشه به طور مثال من می خوام آی دی آخرین رکورد رو داخل یک لیبل نشون بدم


label1.text=dt.rows[dt.rows.count-1]["نام فیلد"]

البته این LINQ نیست ولی در کل این طور میشه که داخل قسمت اول دیتا تیبل که شماره سطر رو باید قرار بدی شما به جای شماره سطر تعداد رکوردها -1 رو قرار بده میبینی به آخرین رکورد جدول اشاره میکنه موفق باشی
سلام
ممنون از جوابتون
راه دیگه ای وجود نداره که نخوام از دیتا تیبل استفاده کنم؟؟؟

Majid.Stu66
پنج شنبه 26 دی 1392, 18:05 عصر
با سلام


int last = (from it in datacontext.UserDatas
select it.ID).Max();

rezaei_y
پنج شنبه 26 دی 1392, 20:36 عصر
همچنین میتونی جدولت رو بر حسب فیلد مورد نظرت به صورت نزولی مرتب کنی اونوقت اخرین رکورد میشه اولین رکورد

farzaneh_bala
پنج شنبه 26 دی 1392, 21:23 عصر
با سلام


int last = (from it in datacontext.UserDatas
select it.ID).Max();
سلام
ممنون از جوابتون
بالاخره بعد از امتحان کردن انواعِ کوئری ها این کد بهم جواب داد...
ولی خیلی دوست داشتم از استورپروسیجر برای به دست آوردن آخرین آی دی استفاده کنم
راهی وجود داره؟؟؟

farzaneh_bala
پنج شنبه 26 دی 1392, 21:26 عصر
همچنین میتونی جدولت رو بر حسب فیلد مورد نظرت به صورت نزولی مرتب کنی اونوقت اخرین رکورد میشه اولین رکورد
جدول برحسب فیلدموردِ نظرم مرتب هست...و من هم همون آخرین رکوردی که میگین رو میخوام...راه به دست آوردنشو نمیدونستم...

Majid.Stu66
پنج شنبه 26 دی 1392, 22:51 عصر
ولی خیلی دوست داشتم از استورپروسیجر برای به دست آوردن آخرین آی دی استفاده کنم
راهی وجود داره؟؟؟

با سلام مجدد
پروسیجری که باید نوشته شه :

Create PROCEDURE LastRecordID(@output int OUTPUT)
AS
BEGIN
set @output=(select Max(ID) From UserData)
END

در برنامه دو خط کد زیر استفاده میشه و مقدار بازگشتی در متغیر ارسال شده به پروسیجر قرار می گیره


int? MaxId = -1;
datacontext.LastRecordID(ref MaxId);

farzaneh_bala
جمعه 27 دی 1392, 10:29 صبح
datacontext.LastRecordID(ref MaxId);[/CODE]
باز هم ممنون
میشه توضیح بدین برای چی از ref استفاده کردید؟؟؟

Majid.Stu66
جمعه 27 دی 1392, 12:24 عصر
قبل از پاسخ به سوال شما :
معمولا برای استخراج تک مقدار از فانکشن استفاده می کنن که پیاده سازی فانکش عملکرد مورد نظر شما بصورت زیر هستش


Create FUNCTION MaxID()
RETURNS int
AS
BEGIN
Declare @Out int
Set @Out=(select Max(ID) From UserData)
RETURN @Out
END

کد مورد استفاده در برنامه


int? ID = datacontext.MaxID();


بازگشت مقدار از پروسیجر با دستور سلکت صورت می گیره و از نوع

ISingleResult<LastIDResult>
هستش که اگه بخوایم به این صورت پروسیجر رو استفاده کنیم کد نوشته شده در سمت برنامه بصورت زیر :


ISingleResult<LastIDResult> Maxid = datacontext.LastRecordID();
foreach (LastIDResult item in Maxid)
{
MessageBox.Show(item. LastRecID.ToString());
}


و پروسیجر به شکل :


Create PROCEDURE LastRecordID
AS
BEGIN
select Max(ID) As LastRecID From UserData
END

خواهد بود .
در پاسخ به سوال شما برای اینکه یه مقدار کاهش کد داشته باشیم و بصورت فوق کد نویسی نکنیم متغیر رو به شکل کال بای ریفرنس (فراخوانی با ارجاع) به پروسیجر ارسال می کنیم که داخل پروسیجر مقدارش عوض شه و از اون مقدار در برنامه استفاده کنیم. این نوع فراخوانی نیاز به مقدار دهی متغیر قبل از ارسال داره ، به همین خاطر قبل از ارسال مقدار منفی یک بهش نسبت داده شده . اگر هیچ رکوردی در جدول وجود نداشته باشه مقدار بازگشتی از پروسیجر نال خواهد بود . در نتیجه باید بعد از فراخوانی مقدار متغیر رو بررسی کرد که نال نباشه بعد ازش استفاده کرد .

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

farzaneh_bala
جمعه 27 دی 1392, 12:40 عصر
از توضیح کاملی که دادین ممنونم...
خیلی بهم کمک کرد...

alireza_s_84
جمعه 27 دی 1392, 14:47 عصر
استفاده از تابع Max اصلا بهینه نیست ، بخصوص اینکه تعداد رکوردهای ما زیاد باشه. SqlServer بین تمامی رکوردها میگرده و بیشترین مقدار رو بر میگردونه و این اصلا چیز خوبی نیست. کاربرد تابع Max در برگردندن آخرین Id نیست بلکه کاربرد این تابع برگردوندن بیشترین مقدار از یک ستون برای ماست مثلا کاربر صحیح میتونه استفاده از این تابع برای گرفتن بیشترین امتیاز یک کاربر هست.

برای برگردوندن Id آخرین رکورد ثبت شده از SELECT SCOPE_IDENTITY() استفاده کنید.

Majid.Stu66
جمعه 27 دی 1392, 17:23 عصر
از توضیح کاملی که دادین ممنونم...
خیلی بهم کمک کرد...
خواهش می کنم ولی گفته این دوست عزیز رو هم در نظر بگیرید.


استفاده از تابع Max اصلا بهینه نیست ، بخصوص اینکه تعداد رکوردهای ما زیاد باشه. SqlServer بین تمامی رکوردها میگرده و بیشترین مقدار رو بر میگردونه و این اصلا چیز خوبی نیست. کاربرد تابع Max در برگردندن آخرین Id نیست بلکه کاربرد این تابع برگردوندن بیشترین مقدار از یک ستون برای ماست مثلا کاربر صحیح میتونه استفاده از این تابع برای گرفتن بیشترین امتیاز یک کاربر هست.
با سلام خدمت دوست گرامی alireza_s_84 (http://barnamenevis.org/member.php?35861-alireza_s_84)
گفته شما کاملا درست هستش . هر چیزی رو باید در جای خود به کار برد.
در رابطه با
SELECT SCOPE_IDENTITY()
آیا باید همراه با یک دستور Insertبکار برده بشه تا آخرین مقدار رو بر گردونه یا بصورت تنها مقدار مورد نظر رو بر می گردونه ؟
چون تا جایی که من متوجه شدم تو استفاده از این تابع بحث میدان دید ( اسکوپ ) که می تونه تابع ، پروسیجر ، تریگر و غیره باشه و بحث ُSession که پایگاه داده هستش پیش میاد . و این تابع باید درون اسکوپ به همراه یک دستور insert باشه که مورد استفاده دوستمون فقط گرفتن آخرین مقدار هستش نه دستور Insert .
ممنون میشم اگه توضیح بدید.

farzaneh_bala
جمعه 27 دی 1392, 17:27 عصر
استفاده از تابع Max اصلا بهینه نیست ، بخصوص اینکه تعداد رکوردهای ما زیاد باشه. SqlServer بین تمامی رکوردها میگرده و بیشترین مقدار رو بر میگردونه و این اصلا چیز خوبی نیست. کاربرد تابع Max در برگردندن آخرین Id نیست بلکه کاربرد این تابع برگردوندن بیشترین مقدار از یک ستون برای ماست مثلا کاربر صحیح میتونه استفاده از این تابع برای گرفتن بیشترین امتیاز یک کاربر هست.

برای برگردوندن Id آخرین رکورد ثبت شده از SELECT SCOPE_IDENTITY() استفاده کنید.
درسته....اینو همون دیشب امتحان کردم...
ولی یکم با فهمیدنش مشکل دارم...

alireza_s_84
جمعه 27 دی 1392, 17:44 عصر
خواهش می کنم ولی گفته این دوست عزیز رو هم در نظر بگیرید.
با سلام خدمت دوست گرامی alireza_s_84 (http://barnamenevis.org/member.php?35861-alireza_s_84)
گفته شما کاملا درست هستش . هر چیزی رو باید در جای خود به کار برد.
در رابطه با
SELECT SCOPE_IDENTITY()
آیا باید همراه با یک دستور Insertبکار برده بشه تا آخرین مقدار رو بر گردونه یا بصورت تنها مقدار مورد نظر رو بر می گردونه ؟
چون تا جایی که من متوجه شدم تو استفاده از این تابع بحث میدان دید ( اسکوپ ) که می تونه تابع ، پروسیجر ، تریگر و غیره باشه و بحث ُSession که پایگاه داده هستش پیش میاد . و این تابع باید درون اسکوپ به همراه یک دستور insert باشه که مورد استفاده دوستمون فقط گرفتن آخرین مقدار هستش نه دستور Insert .
ممنون میشم اگه توضیح بدید.

SOCPE_ADENTITY رو میتونید بعد از Insert به کار ببرید و برای جاهای دیگه میتونید از توابع دیگه ای مثل IDENT_CURRENT و IDENTITY@@ استفاده کنید.
هر سه ی این توابع یک کار انجام میدن در رابطه با حوزه و جلسه تفاوت هایی باهم دارن. برای مثال SCOPE_ADENTITY محدود به جلسه جاری میشه ولی IDENTITY@@ محدودیتی نداره.
در واقع بهترین گزینه برای داشتن آخرین ID در یک جدول استفاده از:
IDENT_CURRENT( 'table_name' )
هست که نه به اسکوپ محدود میشه و نه جلسه بلکه به جدولی که اسم میبریم محدود میشه.
میتونید توی این لینک اطلاعات بیشتری کسب کنید:
http://technet.microsoft.com/en-us/library/ms190315.aspx

Majid.Stu66
جمعه 27 دی 1392, 17:51 عصر
SOCPE_ADENTITY رو میتونید بعد از Insert به کار ببرید و برای جاهای دیگه میتونید از توابع دیگه ای مثل IDENT_CURRENT و IDENTITY@@ استفاده کنید.
هر سه ی این توابع یک کار انجام میدن در رابطه با حوزه و جلسه تفاوت هایی باهم دارن. برای مثال SCOPE_ADENTITY محدود به جلسه جاری میشه ولی IDENTITY@@ محدودیتی نداره.
در واقع بهترین گزینه برای داشتن آخرین ID در یک جدول استفاده از:
IDENT_CURRENT( 'table_name' )
هست که نه به اسکوپ محدود میشه و نه جلسه بلکه به جدولی که اسم میبریم محدود میشه.
میتونید توی این لینک اطلاعات بیشتری کسب کنید:
http://technet.microsoft.com/en-us/library/ms190315.aspx

ممنون از پاسخ تون

s0110h
یک شنبه 02 مهر 1396, 23:01 عصر
با سلام


int last = (from it in datacontext.UserDatas
select it.ID).Max();
خیلی ازتون بابت پاسختون متشکرم