ورود

نسخه کامل مشاهده نسخه کامل : چطور میشه AutoNumber رو بعد از ثبت بدست آورد؟



MTPROG
02-07-2009, 10:07
فرض کنیم با یه یک Insert تو برنامه رکوردی درج می کنیم که یک فیلد اون AutoNumber هستش چطور میشه اونو بدست آورد ؟

مثال table1: id (AutoNumber) , felid1 , felid2 , felid3


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
نکته :روشهای دیگه ای هست مثل گرفتن آخرین رکورد و یا دستور ExecuteScaler() ولی این روشها برای حالت تک کاربره کاربرد داره ولی این حالتو برای برنامه تحت شبکه میخوام

با تشکر

عــــلی
02-07-2009, 11:32
سلام خسته نباشید. معملولاً یا همیشه آخرین AutoNumber که ثبت میشه از همه بزرگتره شما با تابع Max میتونی اونو بدست بیاری مثلاً: Select Max(ID) From TBL_1 موفق باشید.

_H2_
02-07-2009, 12:53
سلام
با تشکر از دوست عزیزمان جناب hamishebahar ...
روش MAX در برنامه های شبکه ای که احتمال درج همزمان داده از چندین رایانه مجزا وجود دارد چندان مناسب نیست، ضمن اینکه روش تضمینی به نام IDENTITY وجود دارد...
(به پست 8 و 9 تاپیک زیر دقت کنید، هر چند مطالعه کل تاپیک هم خالی از لطف نیست)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

جمیعاً موفق باشید.

MTPROG
04-07-2009, 09:18
سلام خسته نباشید. معملولاً یا همیشه آخرین AutoNumber که ثبت میشه از همه بزرگتره شما با تابع Max میتونی اونو بدست بیاری مثلاً: Select Max(ID) From TBL_1 موفق باشید.

همونطور که اول گفتم برای تحت شبکه کاربرد نداره و همچنین جناب H2 هم اشاره کردند


(به پست 8 و 9 تاپیک زیر دقت کنید، هر چند مطالعه کل تاپیک هم خالی از لطف نیست)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

جالبه این تاپیک رو خودم مطرح کرده بودم:31:!

چیزی که تو این دوتا تاپیک به چشم میخوره اینه


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

این دستور آخرین Id ثبت شده رو برمیگردونه مثل همون Select Max(ID) From TBL_1 و فکر نکنم تحت شبکه جوابگو باشه چون همیشه آخری رو برمیگرونه و احتمال داره که موقعی که چند تا کاربر همزمان در بانک درج میکنن مشکل پیش بیاد چون در شبکه های سریع سرعت در حد میلی ثانیه است


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این هم تقریبا شبیه بالا هستش ولی یکم بهتر عمل میکنه البته مشکلاتی هم داره که آخرین id درج شده در کل بانک اطلاعاتی رو بر میگردونه نه یک جدول بخصوص بازم اینم در شبکه های سریع احتمال اختلال وجد داره
(البته نمی دونم شاید من زیاد وسواس به خرج میدم البته احتمال خطا باز وجود داره)

در کل من می خوام این id رو تو برنامه بدست بیارم یعنی با این یه همچین چیزی باید در بیاد؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
آیا درسته؟

_H2_
04-07-2009, 11:06
سلام

جالبه این تاپیک رو خودم مطرح کرده بودم
اصلاً دقت نکرده بودم! خیلی جالب توجه است!

دستور ;SELECT @@IDENTITY را در نظر بگیرید...
این کاملاً صحیح است که این دستور آخرین autonumber درج شده در کل دیتابیس را بر میگرداند ولی روش آن بسیار بسیار متفاوت از MAX است و اصلاً در آن زمان تاثیری ندارد! 5 دقیقه بعد هم بخوانید همچنان جواب صحیحی را که میخواهید بازپس میدهد!!!!

در واقع چیزی که در دستور فوق معمولاً گفته نمیشود ان است که این دستور آخرین autonumber درج شده در دیتابیس توسط جلسه connection جاری را برمیگرداند!!!!
این مطلب در مورد هر دو سینتکس SCOPE_IDENTITY, @@IDENTITY صادق است.
فقط سینتکس IDENT_CURRENT محدودیتی روی جلسه جاری ندارد.

در نتیجه بدون توجه به زمان میتوانید دستور فوق را اجرا کنید.
(این قانون SqlServer است و به احتمال غریب به یقین در Jet هم وجود دارد.)

موفق باشید.

MTPROG
04-07-2009, 11:43
این دستور آخرین autonumber درج شده در دیتابیس توسط جلسه connection جاری را برمیگرداند
واقعا این نکته بسیار مهمیه که اصلا روش بحث نشده:41:

خیلی ممنون دیگه خیلم راحت شد و از این روش استفاده میکنم:20:

ولی یه سئوال دیگه هم داشتم

وقتی تو دستورات SQL یک مقدار و یا نتیجه خروجی یک SELECT و یا همون ID رو در یک متغییر تعریف شده در SQL قرار میدم میتونم به مقدار اون متغیر تو محیط برنامه نویسی VS دسترسی داشته باشم؟

با تشـــــــــــــــــــــــ ــــــکر

_H2_
04-07-2009, 13:39
سلام

وقتی تو دستورات SQL یک مقدار و یا نتیجه خروجی یک SELECT و یا همون ID رو در یک متغییر تعریف شده در SQL قرار میدم میتونم به مقدار اون متغیر تو محیط برنامه نویسی VS دسترسی داشته باشم؟
انتقال از sqlserver به داخل برنامه فقط سه راه دارد.
- با دستور select و شی datareader
- در SP ها و پارامترهای ouput
- در SP ها و با مقادیر بازگشتی تابع با دستور return

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
04-07-2009, 18:11
سلام
مطلب مندرج در پست 5 اصلاح شد ...
کمی فراموش کرده بودم ولی بالاخره چیزهایی یادم آمد !!!
سینتکس IDENT_CURRENT وابسته به جلسه جاری نیست. که بدین وسیله اصلاحش میکنم.

(پست جدید زدم تا دوستان دیگر هم مجدداً تاپیک را مطالعه کنند)

MTPROG
05-07-2009, 08:41
خیلی ممنون از اصلاح پست 5
برای بدست آوردن متغیر مشکلم حل شد
ولی حالا یک مشکل تو شرطهای IF تو محیط SQL SERVER دارم
همونطور که میدونید ساختارش اینطوریه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تو ACCESS از دستور IIF استفاده می شه
مثال: فرض کنید حاصل یک دستور SELECT مثلا 15 خطی میشه X و اگر X منفی بود ضرب در 1000 و اگر مثبت بود ضرب در 2000 بشه تو محیط اکسس اینجوری میشه

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و مشکلی نیست

ولی تو IF مربوط به SQL مشکل بدست میاد مثلا نمیشه از دستور زیر استفاده کرد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بلکه باید دوبار کل دستورات در دو حالت If و ELSE با شرط موجود بنویسی


آیا راهی برای حل این مشکل هست؟
با تشـــــــــــــــکر

_H2_
06-07-2009, 13:10
سلام
اول تا جایی که من میدانم IF در TSQL دیگر THEN ای ندارد!!!
اون ساختار را از هر کجا گیر آوردید اشتباه است.
درستش اینچنین است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

دوماً معادل IIF در TSQL ساختار CASE است که خیلی قدرتمند تر از IIF است.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یعنی دستور شما در TSQL چنین میشود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

MTPROG
07-07-2009, 08:26
اول تا جایی که من میدانم IF در TSQL دیگر THEN ای ندارد!!!

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


دوماً معادل IIF در TSQL ساختار CASE است که خیلی قدرتمند تر از IIF است.
دقیقا همون چیزیه که من میخواستم خیلی ممنون

راستی این دستور Case رو میتوان گفت که شبیه دستور SWITCH تو ACCESS است؟




برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید