PDA

View Full Version : فیلد id -کم و زیاد شدن و فهمیدن دقیق id یک رکورد



sara_aryanfar
پنج شنبه 31 شهریور 1390, 13:34 عصر
با سلام من در دیتا بیس خودم یه فیلد id تعریف کردم که با اضافه کردن رکورد جدید خودش افزایش پیدا می کنه حالا دوتا سوال برام پیش اومده
1-وقتی رکوردی حذف میشه و یه رکور جدید اضافه میشه فیلد درست نیست یعنی مثلا 4 رکورد داریم دوتا از اونا رو حذف می کنیم و یه رکورد جدید اضافه می کنیم حالا به جای اینکه id رکورد جدید بشه 3 مینویسه 5 چطور باید برطرف بشه؟

2- چطوری می تونم id دقیق یک رکورد رو به دست بیارم تا برای سایر عملیات ها از اون استفاده کنم؟

ممنون

EhsanAvr
پنج شنبه 31 شهریور 1390, 13:52 عصر
سلام یه خورده بیشتر توضیح بدین که دقیقا میخواین چیکار کنین! آخه یه id که aoutonumber باشه نیازی نیست که مقدارشو شما تعیین کنین چون فقط یه ایندکس هست که از طریق اون میشه به اطلاعات یک فیلد دسترسی پیدا کرد.حالا شما اگه خواسته باشین id یک رکورد رو به دست بیارین خیلی راحت میتونین با استفاده از بقیه فیلدها (به شرطی که فیلد با مقدار تکراری نباشد) این کار رو انجام بدین.

water_lily_2012
پنج شنبه 31 شهریور 1390, 15:26 عصر
من برای این کار روش زیر را انتخاب کرده ام:
فیلد ID را از حالت اتوماتیک خارج کرده ام و خودم مقدار برای این فیلد در نظر میگیرم.
در نظر گرفتن مقدار هم به این صورت هست که این ستون را بر اساس کوچک به بزرگ دستیابی می کنم و سپس تک تک رکورد ها را مقایسه می کنم که آیا با متغیر من برابر هست یا نه. اگر بود که یعنی در جدول هست و اگر برابر نبود یعنی این شماره پاک شده.
باز هم دقیقتر توضیح بدهم: به این صورت که مقدار ID رکورد اول چون مرتب هست باید 1 باشه و بعدی 2 و الی آخر. حالا من در یک For یا Each با متغیرم که از 1 شروع میشه چک می کنم. اگر هر دو برابر بودند که یعنی عدد در دیتابیس هست و اگر نبودند یعنی اینکه مثلا متغیر من 8 هست و ID شده 9 یعنی 8 در جدول نیست.
ان شاءالله که متوجه شده باشید.

EhsanAvr
پنج شنبه 31 شهریور 1390, 15:41 عصر
من برای این کار روش زیر را انتخاب کرده ام:
فیلد ID را از حالت اتوماتیک خارج کرده ام و خودم مقدار برای این فیلد در نظر میگیرم.
در نظر گرفتن مقدار هم به این صورت هست که این ستون را بر اساس کوچک به بزرگ دستیابی می کنم و سپس تک تک رکورد ها را مقایسه می کنم که آیا با متغیر من برابر هست یا نه. اگر بود که یعنی در جدول هست و اگر برابر نبود یعنی این شماره پاک شده.
باز هم دقیقتر توضیح بدهم: به این صورت که مقدار ID رکورد اول چون مرتب هست باید 1 باشه و بعدی 2 و الی آخر. حالا من در یک For یا Each با متغیرم که از 1 شروع میشه چک می کنم. اگر هر دو برابر بودند که یعنی عدد در دیتابیس هست و اگر نبودند یعنی اینکه مثلا متغیر من 8 هست و ID شده 9 یعنی 8 در جدول نیست.
ان شاءالله که متوجه شده باشید.

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

seven7777777
پنج شنبه 31 شهریور 1390, 16:02 عصر
ببینید تعریف شما از ID مشکل داره .
در دیتابیس ID فیلد یکتایی هست که از اون برای شناسایی یک ردیف به صورت یکتا استفاده میشه . پس معنی نداره با حذف یک ردیف ID ها جابجا بشه .
حالا این سوال پیش میاد که شما این ID رو میخوای چکار ؟؟؟

برای من یه جواب وجود داره . استفاده از اون به عنوان شماره ردیف در جدولی که اطلاعاتتو نمایش میده که بارها توضیح داده شده از چه روش هایی میشه استفاده کرد .
اگه مشکلتون همینه ، بفرمایید تا روی اون روش ها بحث بشه .

موفق باشید

water_lily_2012
پنج شنبه 31 شهریور 1390, 16:36 عصر
روش استانداردی نیست چون اگه تعداد رکوردها زیاد باشه شدیدا به مشکل برمیخوریم

با توجه به سرعت سیستم های امروزی و برنامه های ساده که نوشته میشه، فکر نکنم آنچنان مشکلی باشه.
حداقل من برای دیتابیس 300 هزار رکوردی هم که امتحان کرده سریع انجام شد.
ولی شما اگر راه بهتری دارید ذکر کنید تا من هم بهره ببرم.

FastCode
پنج شنبه 31 شهریور 1390, 17:24 عصر
با توجه به سرعت سیستم های امروزی و برنامه های ساده که نوشته میشه، فکر نکنم آنچنان مشکلی باشه.
حداقل من برای دیتابیس 300 هزار رکوردی هم که امتحان کرده سریع انجام شد.
ولی شما اگر راه بهتری دارید ذکر کنید تا من هم بهره ببرم.
شوخی میکنی؟
من با ۲۰۰ هزار تا همین هفته قبل یک uuid Collision داشتم.


مشکل شما هم سه تا راه حل درست داره(نه مواردی که اشاره شد)
http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/
که از نظر من هیچ کدوم به درد نمیخورن.

sara_aryanfar
پنج شنبه 31 شهریور 1390, 17:25 عصر
با تشکر از دوستان طبق فرمایش دوستمونid یک مقدار یکتا هست بحثی تو این ندارم منظور من اینه که مثلا فرض کنید شما 10 تا رکورد رو پشت سر هم وارد می کنین و id اینا به صورت مرتب ذخیره می شود حالا میاین رکورد 5 و 6 رو حذف می کنین اخرین رکورد شما شماره ایدیش همچنان 10 هست در حالی که دو تا رکورد ما کم شده حالا اگه بخواهیم تعداد رکورد ها رو دربیاریم به نظر شما این مشکل ساز نمیشه

FastCode
پنج شنبه 31 شهریور 1390, 17:26 عصر
ببینید تعریف شما از ID مشکل داره .
در دیتابیس ID فیلد یکتایی هست که از اون برای شناسایی یک ردیف به صورت یکتا استفاده میشه . پس معنی نداره با حذف یک ردیف ID ها جابجا بشه .
حالا این سوال پیش میاد که شما این ID رو میخوای چکار ؟؟؟

برای من یه جواب وجود داره . استفاده از اون به عنوان شماره ردیف در جدولی که اطلاعاتتو نمایش میده که بارها توضیح داده شده از چه روش هایی میشه استفاده کرد .
اگه مشکلتون همینه ، بفرمایید تا روی اون روش ها بحث بشه .

موفق باشید
خیر
این Id رو میخواد برای insert کردن child ها

FastCode
پنج شنبه 31 شهریور 1390, 17:27 عصر
با تشکر از دوستان طبق فرمایش دوستمونid یک مقدار یکتا هست بحثی تو این ندارم منظور من اینه که مثلا فرض کنید شما 10 تا رکورد رو پشت سر هم وارد می کنین و id اینا به صورت مرتب ذخیره می شود حالا میاین رکورد 5 و 6 رو حذف می کنین اخرین رکورد شما شماره ایدیش همچنان 10 هست در حالی که دو تا رکورد ما کم شده حالا اگه بخواهیم تعداد رکورد ها رو دربیاریم به نظر شما این مشکل ساز نمیشه
تعداد رکورد ها با دو دستور ه:
Select Count(*) from Table
و
Select Count(Id) from Table
به دست میان.که تفاوت اندکی دارن که میتونین توی اینترنت پیدا کنید.(اگر شک دارید از اولی استفاده کنید.)

sara_aryanfar
پنج شنبه 31 شهریور 1390, 17:50 عصر
ممنون شما به بخش اصلی سوالم جواب دادین فقط اینگه چطور در هنگام واکشی اطلاعات ایدی اون رکورد مورد نظرمون رو به دست بیاریم ممنون اگه اینو هم بفرمائید

FastCode
پنج شنبه 31 شهریور 1390, 17:53 عصر
ممنون شما به بخش اصلی سوالم جواب دادین فقط اینگه چطور در هنگام واکشی اطلاعات ایدی اون رکورد مورد نظرمون رو به دست بیاریم ممنون اگه اینو هم بفرمائید
بخش دوم سوالتون رو در لینک اول پاسخ دادم.
یک بار بخونید خودتون متوجه میشید.
سادست و البته کار شما رو کاملاً دقیق جواب میده.(از حلقه for مطمئنتره)

sara_aryanfar
پنج شنبه 31 شهریور 1390, 20:17 عصر
با سلام به لینکی که دادین سر زدم البته روراست نتونستم دقیق بخونم اما مشکل من اونجا نبود ببینید وقتی اطلاعات میاد داخل دیتا گرید ایدیشم میاد درسته؟من می خوام وقتی روش کلیک می کنم منظور روی اون ردیف دیتا گرید id اون ردیف رو به دست بیارم ممنون

sara_aryanfar
پنج شنبه 31 شهریور 1390, 20:27 عصر
با تشکر از همه دوستان تونستم ایدی مورد نظر رو با این کد به دست بیارم

dataGridView1.CurrentCell.Value

ممنون از همه

Mahmoud Zaad
پنج شنبه 31 شهریور 1390, 20:31 عصر
سلام توی رویداد کلیک دیتاگرید کد زیر رو بنویس:
string id = dataGridViewX1.CurrentRow.Cells[0].Value.ToString();