PDA

View Full Version : جلوگیری از حذف رکوردهای جدول child - مسائل Relation



sh
شنبه 19 فروردین 1385, 00:20 صبح
سلام

اگر ممکنه یه توضیح در مورد مسائل زیر بدین

1- آیا Relation در سطح دیتا بیس انجام شود بهتر است یا در DataSet ؟

2- دو جدول داریم یکی نویسنده کتاب دیگری کتابهای نویسنده . اگر کاربر بخواد نویسنده رو حذف کنه متوجه وجود فیلد مرتبط با این نویسنده در جدول دیگر بشه و برنامه پیغام بده که در صورت تائید همه کتابهای وی نیز حذف میشود ؟

دوستان اگر ممکنه یه مثال بزنید

meh_secure
شنبه 19 فروردین 1385, 00:44 صبح
من خودم Relation رو در سطح database انجام می دم. چون در اونجا راحت می تونم بگم که Update یا Delete در جدول های Child به چه صورت انجام بشه. همانطوری که میدونید میتوان حالت آبشاریCascade یا Set null یا ... را برای جدول های Child انتخاب کرد.

سوال دومت هم که با یک کوئری گیری ساده از جدول child و بررسی وجود رکورد های مرتبط براحتی قابل حله.

Hamedm
شنبه 19 فروردین 1385, 09:40 صبح
سلام

1- آیا Relation در سطح دیتا بیس انجام شود بهتر است یا در DataSet ؟ من خودم همیشه Relationهارو در سطح دیتابیس قرار میدم.

2- دو جدول داریم یکی نویسنده کتاب دیگری کتابهای نویسنده . اگر کاربر بخواد نویسنده رو حذف کنه متوجه وجود فیلد مرتبط با این نویسنده در جدول دیگر بشه و برنامه پیغام بده که در صورت تائید همه کتابهای وی نیز حذف میشود ؟یک پروژه داشتم که باید مشابه کار شمارو انجام میدادم. ببین عزیز جان بستگی به اون فیلدهای مرتبط داره که چیه.
اون برنامه من اون فیلدهارو نیاز داشت (حتی اگه فرد از برنامه حذف بشه باید اون فیلدهاش میموند) بخاطر همین نمیتونستم فرد رو از دیتابیس حذف کنم. برای حل این مشکل برای هر فرد یک فیلد Active گرفتم که اگه میخواستم فرد رو حذف کنم، مقدار این فیلد رو False میکردم و برنامه هرگز فردی که فیلد Active اون False است رو نشون نمیداد.

در پناه حق موفق باشید و پرتوان

sh
شنبه 19 فروردین 1385, 15:25 عصر
دوستان عزیز چندین ساله که این کار رو خودم با یه کوئری ساده انجام میدم

بگذارین منظورم رو واضحتر بگم

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

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


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

Hamedm
شنبه 19 فروردین 1385, 19:46 عصر
سلام

ببینید فکر کنیم میخوایم یه شماره پرسنلی تکراری وارد نشه میایم اون رو کلید اصلی در نظر میگیریم وقتی مقدار تکراری وارد شد یه شماره خطا به ما برگشت داده میشه که در زمان آپدیت میگم از شماره خطا مساوی فلان بود این مقدار قبلا درج شده
اول من یک چیز بگم:
PK همیشه یکتا است یعنی یکبار تولید میشه (یا کاربر یکبار وارد میکنه) و هرگز نباید UPDATE بشه (یکی از قوانین طراحی دستابیس).

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

در پناه حق موفق باشید و پرتوان

sh
شنبه 19 فروردین 1385, 22:51 عصر
هرگز نباید UPDATE بشه (یکی از قوانین طراحی دستابیس).


مگه کسی خواسته آپدیتش کنه ؟ کاربر میخواد کالا تعریف کنه با کد کالا بالاخره پیش میاد که یه شماره ای رو که قبلا وارد کرده بازم وارد کنه

و حالا اینکه این مثال رو در مورد اخطار مناسب ببین :



Try
OleDbDataAdapter2.Update(DataSet11, "Mocode")
mocode()
Catch ex As OleDb.OleDbException
If ex.ErrorCode = -2147467259 Then
MessageBox.Show("کد موتور وارد شده تکراری میباشد", "تعریف موتور", MessageBoxButtons.OK, MessageBoxIcon.Warning)
DataSet11.mocode.Clear()
TextBox9.Focus()
ExitSub
EndIf
MessageBox.Show("برای رفع مشکل با برنامه نویس تماس بگیرید" & vbCrLf & ex.Message.ToString, "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error)
EndTry


منظورم من اینه که آیا روش به دام انداختن در مورد جداول پدر و فرزند یه چیزی شبیه کد بالاست یا نه و اگر کسی انجام داده یه مثال بگذاره

meh_secure
شنبه 19 فروردین 1385, 23:51 عصر
در رابطه با خطا که فرمودید. اگر در تعریف رابطه ها تغییرات رو به صورت cascade یا هر چیزی قرار بدید همانطوری که قبلا هم گفته شد عمل می کنه. اما اگه این خصوصیات(همون Enforce entegrity) رو مقدار دهی نکنید یک پیغام خطا براتون تولید می کنه و اون هم بخاطر وجود رکوردهای چایلد در جداول مرتبط می باشد. و به این ترتیب از وجود رکوردهای چایلد مطلع میشید.

linux
یک شنبه 20 فروردین 1385, 09:33 صبح
این کدخطاهایی که روش چک می کنی حواست باشه این ها نیستند.

sh
یک شنبه 20 فروردین 1385, 18:08 عصر
این کدخطاهایی که روش چک می کنی حواست باشه این ها نیستند

کدوم کد خطا ؟ یکم توضیح بده

mohammad-goodarzi
چهارشنبه 16 آذر 1390, 09:49 صبح
با سلام
مي خواستم بدونم چه جوري ميشه از حذف شدن ركوردي كه با ركرودهاي جداول ديگر در ارتباط هست جلوگيري كنم و يه پيغام خطا بده چون اطلاعات در جداول ديگر ثبت شده امكان حذف وجود ندارد
ممنون ميشم اگه در قالب يه مثال به من كمك كنيد