تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 2 12 آخرآخر
نمايش نتايج 1 به 10 از 11

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

  1. #1
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض چطور میشه AutoNumber رو بعد از ثبت بدست آورد؟

    فرض کنیم با یه یک Insert تو برنامه رکوردی درج می کنیم که یک فیلد اون AutoNumber هستش چطور میشه اونو بدست آورد ؟

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

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

    با تشکر

  2. #2
    کاربر فعال انجمن دات نت عــــلی's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    زیر سایه عرش الهی
    پست ها
    2,335

    11

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

  3. این کاربر از عــــلی بخاطر این مطلب مفید تشکر کرده است


  4. #3
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

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

  5. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  6. #4
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

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

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

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

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

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

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

  7. #5
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

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

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

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

    موفق باشید.
    Last edited by _H2_; 04-07-2009 at 18:07.

  8. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  9. #6
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    این دستور آخرین autonumber درج شده در دیتابیس توسط جلسه connection جاری را برمیگرداند
    واقعا این نکته بسیار مهمیه که اصلا روش بحث نشده

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

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

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

    با تشـــــــــــــــــــــــ ــــــکر
    Last edited by MTPROG; 04-07-2009 at 11:58.

  10. #7
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

  11. #8
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    مطلب مندرج در پست 5 اصلاح شد ...
    کمی فراموش کرده بودم ولی بالاخره چیزهایی یادم آمد !!!
    سینتکس IDENT_CURRENT وابسته به جلسه جاری نیست. که بدین وسیله اصلاحش میکنم.

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

  12. #9
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

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

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


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

  13. #10
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    اول تا جایی که من میدانم IF در TSQL دیگر THEN ای ندارد!!!
    اون ساختار را از هر کجا گیر آوردید اشتباه است.
    درستش اینچنین است:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    دوماً معادل IIF در TSQL ساختار CASE است که خیلی قدرتمند تر از IIF است.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    یعنی دستور شما در TSQL چنین میشود:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    موفق باشید.

صفحه 1 از 2 12 آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •