PDA

View Full Version : اگرخاصیتautoincrementفعال باشه می شه شماره ردیف سطرها رومرتب کرد



asefy2008
پنج شنبه 24 مرداد 1387, 21:20 عصر
سلام دوستان
مشکلم این هست که می خوام پس از هر بار حذف از dbستون مربوط به ردیف مرتب بشه
به عنوان مثال با حذف یک سطر در میانه لیست شماره ردیف مربوط به اون سطر به سطر بعدی داده بشه
آیا اگر خاصیتautoincrementفعال باشه می شه با کد عمل فوق رو انجام داد
اگر هم فعال نباشه آزمایش کردم کدم دفعه اول تو saveمشکل نداره ولی بار دوم مشکل پیدا می کنه اگرمی شه کمک کنید سه هفته من مشغول خودش کرده

hdv212
پنج شنبه 24 مرداد 1387, 21:52 عصر
خب اگه دیتابیس شما SqlServer 2005 باشه، میتونی از این دستور برای نمایش شماره ردیف در کنار رکوردها استفاده کنی :

-- Syntax is :
-- SELECT ROW_NUMBER() OVER (ORDER BY Pk-Column) [AS AliasName],* FROM TableName
select row_number() over (order by orderID) as rowID,* from orders
اما Sql Server 2000 این قابلیت رو نداره و باید از روشهای دیگه ای در سمت دیتابیس استفاده کنی که Performance خوبی نداره، اما اگر میخوای توی برنامه ات به صورت Dynamic به رکوردهای مقیم در حافظه اضافه کنی میتونی از این نمونه کد استفاده کنی(فقط قبل از اینکه آبجکت DataTable مورد نظرت رو Fill کنی، این تابع رو فراخوانی کن) :

private void CreateIdentityColumn()
{
DataColumn dc = new DataColumn("rowID");
dc.Caption = "ردیف";
dc.AutoIncrement = true;
dc.AutoIncrementSeed = 1;
dc.AutoIncrementStep = 1;
this.dt1.Columns.Add(dc);
}

رضا جاسبی
جمعه 25 مرداد 1387, 00:01 صبح
شما می خواهی یکی از فیلدهای جدولت که نشون دهنده ردیف یا ID هست در خود db مرتب باشه یا در برنامه که نمایش می دهی. اگر در db می خواهی می تونی با یک کد خودت اصلاح کنی. و البته نمی دونم که با فیلد AutoIncrement (یا همون Identity اگر من درست فهمیده باشم) به error می خوره یا نه. به نظر من برای اینکه در خود db هم درست داشته باشی در یک trigger بنویس. و البته اگر فیلد مورد نظر کلید باشه کمی کار سختتر میشه چون سطر دوم به مشکل تکراری بودن می خوره.
به هر حال اگر کلید نباشه با این دستور


Update MyTable
Set Field = Field-1
Where Filed > DeletedField

قضیه مرتب بودن حل میشه.
که به نظر من این رو در trigger در خود db بذار که کارت مطمئن باشه

asefy2008
جمعه 25 مرداد 1387, 17:27 عصر
در مورد تایپیک 2:این private void CreateIdentityColumn()رو گذاشتم ولی اشکال میگیره اما فکر کنم درست قرار ندادم لطفآ بیشتر راهنمایی کنید تازه کارم
در مورد تایپیک 3 هم فیلد مورد نظر کلید هست
در ضمن چون باید در زمان اجرا، مقادیر فیلد های مجاور هم تغییر کن بهتر از راه کد این کار انجام بشه
به عنوان مثال بازدن دکمه حذف علاوه بر این که شماره ردیف مورد نظر به ردیف بعد تعلق بگیره باید تمامی مقادیر به گرید اصلی برگردانده شود
اما کد خودم خواستم بااستفاده از گرید مقادیر رو تغییر بدم که بعد از دومین ذخیره گیر میده
اینم کد
reportDataGridView.Rows[count-1].Cells[0].Value = count;
ممنون

hdv212
جمعه 25 مرداد 1387, 20:06 عصر
در مورد تایپیک 2:این private void CreateIdentityColumn()رو گذاشتم ولی اشکال میگیره اما فکر کنم درست قرار ندادم لطفآ بیشتر راهنمایی کنید تازه کارم
چه خطایی میگیره ؟

رضا جاسبی
جمعه 25 مرداد 1387, 23:35 عصر
دوست عزیز این اصلا منطقی نیست که شما مقدار کلیدت رو عوض کنی بخصوص اگر این کلید اصلی در یک جدول دیگر کلید خارجی باشد که دیگه مصیبت عظماست. در زمان نوشتن در دیتابیس دقیقا قضیه همونطوره که خودت گفتی. یعنی در دومین گزینه گیر میده چون مقدار جدیدش همون مقدار سطر اوله که "تا انتهای دستور Update" مقدار قبلیش رو داره.
به نظر من بهتره که شما یک ستون غیر کلید به نام شماره ردیف درنظر بگیری و اجازه بدی مقدار کلیدت همون مقدار قدیم بمونه. در غیر این صورت فکر کنم نیاز به یک حلقه برای Update داری. بعد از اتمام Update هم می تونی گریدت رو دوباره Load کنی.
البته یک راه دیگه هم هست که بد نیست: اول به همه مقادیر یک عدد بزرگ مثلا 1000 اضافه کنی. (به شرطی که تعداد رکوردهات 1000 تا نباشه. در واقع یک عدد بزرگتر از تعداد رکوردهات) و بعد یکی بیشتر از اون عدد ازشون کم کنی. مثلا:


Update MyTable
Set Field = Field+ 1000
Where Filed > DeletedField

Update MyTable
Set Field = Field - 1001
Where Filed > DeletedField

البته این روش به نوعی قضیه فیلد AutoIncrement رو از بین می بره چون شماره بعدی رو از مثلا 1020 شروع می کنه. به عبارتی یک گپ 1000 تایی برات میندازه.
باز هم توصیه می کنم اگر توالی عددها برات مهمه ستون مستقل غیر کلیدی براش در نظر بگیر.