PDA

View Full Version : حذف مقدار یک فیلد عددي



xvision
دوشنبه 12 بهمن 1388, 11:05 صبح
این مشکل رو توی بخش SQLserver هم مطرح کردم ولی گویا باید اینجا دنبال جوابش باشم !

سعی میکنم مختصر و مفید بگم
من یک جدول دارم که یک ارتباط داخلی داره به این صورت که در جدول person بعضی ها رئیس یک عده دیگه هستن . این ارتباط رو از طریق ثبت ID رئیس برای زیر دست نوشتم .
حالا ممکنه رئیس عوض بشه یا اصلا این فرد رئیس نداشته باشه ( مثلا خودش بشه رئیس )
مشکل اینجاست که نمی دونم وقتی میخوام این فیلد رو که مثلا با عدد 10 مقدار دهی شده خالی کنم باید چیکار کنم !
اگر Type این فیلد از انواع رشته ای بود میشد Null کرد ولی چون عددی هست هیچ کاریش نمی تونم بکنم یعنی حتما باید یک عدد از بین ID های خود جدول رو جانشین کنم
کسی میتونه راهنمایی کنه ؟!

یک توضیح ضروری :
من میتونم توی SP ی که برای Update تعریف کردم ( توی خود SQLserver ) مقدار Null بدم و مشکلی پیش نمیاد اما توی C#‎‎ وقتی می خوام مقدار دهی کنم گیر میده و نمی تونم مقدار رو null بدم !

اَرژنگ
دوشنبه 12 بهمن 1388, 11:48 صبح
این مشکل رو توی بخش SQLserver هم مطرح کردم ولی گویا باید اینجا دنبال جوابش باشم !

سعی میکنم مختصر و مفید بگم
من یک جدول دارم که یک ارتباط داخلی داره به این صورت که در جدول person بعضی ها رئیس یک عده دیگه هستن . این ارتباط رو از طریق ثبت ID رئیس برای زیر دست نوشتم .
حالا ممکنه رئیس عوض بشه یا اصلا این فرد رئیس نداشته باشه ( مثلا خودش بشه رئیس )
مشکل اینجاست که نمی دونم وقتی میخوام این فیلد رو که مثلا با عدد 10 مقدار دهی شده خالی کنم باید چیکار کنم !
اگر Type این فیلد از انواع رشته ای بود میشد Null کرد ولی چون عددی هست هیچ کاریش نمی تونم بکنم یعنی حتما باید یک عدد از بین ID های خود جدول رو جانشین کنم
کسی میتونه راهنمایی کنه ؟!

یک توضیح ضروری :
من میتونم توی SP ی که برای Update تعریف کردم ( توی خود SQLserver ) مقدار Null بدم و مشکلی پیش نمیاد اما توی C#‎‎‎ وقتی می خوام مقدار دهی کنم گیر میده و نمی تونم مقدار رو null بدم !
روش درست این است که از یک جدول دیگر استفاده کنید که کارمندهایی که زیر دست یک نفر کار میکنند را لیستشان را نگهداری کنید.
به این شکل "نسبت بین کارمندها" و "کارمندها" را از هم جدا نگهداری و مدیریت میکنید.

با این روش میتوانید کل ساختمان مدیریت را به شکل شاخه‌ای میریت کنید.

xvision
دوشنبه 12 بهمن 1388, 12:38 عصر
دوست عزيزم ممنون از راهنمايي شما
متاسفانه برنامه به جايي رسيده كه امكان اين تغييرات رو فعلا ندارم اين ها بماند براي ورژن 2 برنامه !
مشكل اساسي اينه كه چطور به يك فيلد كه از نوع int تعريف شده و ميتونه Null هم باشه بوسيله كد مقدار Null بدم !

اَرژنگ
دوشنبه 12 بهمن 1388, 13:17 عصر
دوست عزیزم ممنون از راهنمایی شما
متاسفانه برنامه به جایی رسیده که امکان این تغییرات رو فعلا ندارم این ها بماند برای ورژن 2 برنامه !
مشکل اساسی اینه که چطور به یک فیلد که از نوع int تعریف شده و میتونه Null هم باشه بوسیله کد مقدار Null بدم !

مقدار را DbNull بده.
البته این روش از اصل خرابه و این جواب را از من نشنیدید.

این جواب کمک نیست، به اینکه در روش کج پیش برید کمک حساب میشه و بیشتر از خوبی بدی دارد.

احتیاجی به اینکه در ورژن ۲ این را درست کنید نیست، ضرر را هر جا جلوش را بگیرید سوده، و باید و حتماً قبل از ادامه درستش کنید.

xvision
دوشنبه 12 بهمن 1388, 13:58 عصر
آرژنگ عزیز ممنون از راهنماییت برام جالب شد که برم ببینم این DbNull چی هست و به چه دردی می خوره !
ولی برگردیم سر مشکلم :
شکل کلی پروسیجری که صدا میزنم بصورت زیره :
dl.sp_person_Update( string, string, string, int, string, int, string, int, int);


حالا فرض کن میخوای به جای یکی از این int ها یک مقدار Null بگذارید ! خود این پروسیجر رو وقتی توی SQLserver اجرا میکنم میتونم بهش Null بدم ولی توی سی شارپ حقیقتا موندم باید چیکار کنم .
روش ما متاسفانه برای چنین کدی جواب نداد یا شاید من نتونستم ازش استفاده کنم .
باز هم ممنون

اَرژنگ
دوشنبه 12 بهمن 1388, 14:02 عصر
آرژنگ عزیز ممنون از راهنماییت برام جالب شد که برم ببینم این DbNull چی هست و به چه دردی می خوره !
ولی برگردیم سر مشکلم :
شکل کلی پروسیجری که صدا میزنم بصورت زیره :
dl.sp_person_Update(int, string, string, string, int, string, string, string, int, string, string, int, int);


حالا فرض کن میخوای به جای یکی از این int ها یک مقدار Null بگذارید ! خود این پروسیجر رو وقتی توی SQLserver اجرا میکنم میتونم بهش Null بدم ولی توی سی شارپ حقیقتا موندم باید چیکار کنم .
روش ما متاسفانه برای چنین کدی جواب نداد یا شاید من نتونستم ازش استفاده کنم .
باز هم ممنون

کدی که از سی‌شارپ استفاده میکنید که این پروسیجر را صدا بزنید را بفرستید

xvision
دوشنبه 12 بهمن 1388, 14:08 عصر
کد کمی از اونی که براتون نوشتم بزرگتره !



public virtual System.Data.DataTable sp_person_Update(int ID, string Fname, string Lname, string FatherName, int sen) {
try {
System.Data.SqlClient.SqlConnection con;
con = new System.Data.SqlClient.SqlConnection(this.Connectio nString);
System.Data.SqlClient.SqlCommand cmd;
cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandText = "sp_person_Update";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
System.Data.SqlClient.SqlParameter _ID = new System.Data.SqlClient.SqlParameter();
_ID.ParameterName = "@ID";
_ID.Size = 4;
_ID.Value = ID;
cmd.Parameters.Add(_ID);
.
.
.

xvision
چهارشنبه 14 بهمن 1388, 03:27 صبح
گويا آرژنگ عزيز هم نتونستن مشكل رو حل كنن !
اصلا شما به اون كد نگاه نكنين اينطور فكر كنيد كه من توي DB يك فيلد دارم كه از نوع INT تعريف شده و ميتونه Null هم باشه حالا بعد از اينكه بهش عدد دادم مي خوام اصلاحش كنم و دوباره Null كنم چطور اين كار رو در C# انجام بدم همين !
اينكه جدول من درسته يا نه يك بحث ديگه است مشكل بالا توي هر جدولي ميتونه پيش بياد چه راهي براي حلش پيشنهاد ميكنيد ؟

اَرژنگ
چهارشنبه 14 بهمن 1388, 04:20 صبح
گویا آرژنگ عزیز هم نتونستن مشکل رو حل کنن !
اصلا شما به اون کد نگاه نکنین اینطور فکر کنید که من توی DB یک فیلد دارم که از نوع INT تعریف شده و میتونه Null هم باشه حالا بعد از اینکه بهش عدد دادم می خوام اصلاحش کنم و دوباره Null کنم چطور این کار رو در C#‎‎ انجام بدم همین !
اینکه جدول من درسته یا نه یک بحث دیگه است مشکل بالا توی هر جدولی میتونه پیش بیاد چه راهی برای حلش پیشنهاد میکنید ؟

مشکل اصلی از طراحی است، وقتی که یک ساختمان از بنا خراب است اینکه دوباره رنگش کنیم مهم نیست.

و دلیل اینکه ادامه ندادم باور به این است که یک چیز باید از اصل درست باشد و استفاده از روشهایه ماسمالی کمک نیست.

این روش ماسمالی را با نارضایتی و فقط برایه اینکه کارتان راه بیافته اراعه میدم :
یک پروسیجر دیگر برایه نال کردن فیلد مورد نظر بسازید و بهش آی‌دیه رکورد مورد نظر را پاس بدید.

ولی مشکل اصلی هنوز باقی مانده، و اونهم استفاده از طراحی درست و درست کردن طراحی زمانی که اصل مشکل از طراحی استفاده شده است نه مشکلی که اصلش به تکنیک استفاده شده بازمیگرده.

در ضمن یک مثال از جدولی که این مشکل میشه درش بیاد بزنید، چونکه من هنوز باور ندارم :)

برایه پیشرفت شما در برنامه‌نویسی حتماً روش ساختن جدول و طراحی ساختمانهایه داده را مطالعه کنید.

اگر در پیاده سازی روش (ماسمالی که من پیشنهاد دادم) به مشکلی برخوردید بگید، اینکه کارتان راه بیافته را پیش بینه قرار میدم و دیگر در مورد درستی و یا اشتباهی روشی نطق نمیکنم (در این توپیک :)
موفق باشید

shahab_ss
چهارشنبه 14 بهمن 1388, 08:53 صبح
میتونی بصورت قراردادی مثلاً "1-" رو بعنوان Null در نظر بگیری. هر جایی که ID =-1 بود یعنی این فرد رئیسه !!!

xvision
چهارشنبه 14 بهمن 1388, 10:30 صبح
ميدونيد دوستان فكر ميكنم روش آخري كه آرژنگ گفتن ميتونه كمك كنه البته هنوز امتحان نكردم ولي حقيقتا جداي از جدول خودم برام اين سوال پيش اومده بود و هست كه چطور ميشه اگر براي فيلدي تايپ INT گذاشتيم و اون فيلد قابليت Null شدن هم داشت اگر بهش مقدار داديم چطور ميتونيم دوباره اصلاحش كنيم و مقدارش رو Null كنيم اصلا چنين چيزي شدني هست يا نه ؟!

xvision
چهارشنبه 14 بهمن 1388, 10:49 صبح
یک پروسیجر دیگر برایه نال کردن فیلد مورد نظر بسازید و بهش آی‌دیه رکورد مورد نظر را پاس بدید.


جواب داد و عالي بود ممنونم
اما هنوز سوالي كه برام پيش اومده يه قوت خودش باقيه حالا كه مشكل اصلي من حل شده به نظرم در رابطه با سوالي كه مطرح كردم هم كمي بحث بشه .