PDA

View Full Version : سوال: برنامه نویسی بر روی یک دیتا بیس از قبل تکمیل شده



منصور54
یک شنبه 08 تیر 1399, 00:14 صبح
با سلام و خسته نباشید . من تازه شروع به برنامه نویسی سی شارپ کردم .یه جدول از مشخصات همکارانم را توی SQL ایجاد کردم ..رسیدم به جایی که میخوام اطلاعات وارد شده به جدولم را ثبت کنم ولی پیام خطا می داد روی مقادیر عددی مثل کد ملی و تعداد فرزندان ...اونا رو کانورت کردم و کدش رو بدینصورت نوشتم
(NationalCode = Convert.ToInt32(txtNationalCode.Text
بعد که فیلد ها رو تو فرم پر میکنم و دکمه ثبت رو میزنم ..میرو رو قسمت کد وایمیسه...

daniyaltjm
یک شنبه 08 تیر 1399, 09:08 صبح
سلام،
NationalCode = Convert.ToInt32(txtNationalCode.Text);

ShayanFiroozi
یک شنبه 08 تیر 1399, 21:35 عصر
سلام دوست عزیز

اول از هر چیزی باید دقت داشته باشین اطلاعاتی مثل کد ملی درسته از اعداد تشکیل شدن اما ما در برنامه نویسی معمولا به چشم عدد به اونا نگاه نمیکنیم !!! اونا فقط رشته ان.

پس مقادیری که واقعا ضرورت ندارند رو به شکل رشته ذخیره کنین نه عدد (این کار دلایل زیادی داره مثلا بعد ها اگر بخواین یه قسمت از کد ملی یک نفر رو جستجو کنین در مقادیر عددی این امکان پذیر نیست).

دوما توجه داشته باشین کد ملی استاندارد ایران 10 رقم هست بنا بر این شما نمیتونین کد ملی حدود 60 میلیون ایرانی رو با این روش ذخیره کنید چون رقم حداکثر یه متغییر int عدد 2,147,483,647 هستش !!

و این یعنی یه کد ملی مثل : 8976543210 به هیج وجه در یه متغییر Int32 نمیگنجه !!

شما نوع خطا رو مشخص نکردین(که برای دفعات بعد و طبق قوانین پرسش و پاسخ انجمن بهتره این کار رو انجام بدین) ولی به احتمال قوی خطای overflow دریافت میکنین.

منصور54
یک شنبه 08 تیر 1399, 23:45 عصر
سلام مهندس عزیز ..خیلی ممنون از پاسخ کاملتون . من کارمند یه شرکتم با تعداد حدود 300 نفر کارمند .. اطلاعاتش رو داشتم تو یه بانک تو SQL ایمپورت کردم و دو تا از فیلدهای عددیم که یکی کد ملی و یکی تعداد فرزندان بود رو فقط با دیتا تایپ float قبول کرد . کد ملی رو هم کلید گذاشتم .. حالا که فرم ها رو درست کردم ..کل اطلاعات تو گریدویو میاد ..اما موقع افزودن مشخصات نفر جدید ..اول گیر میداد به کد این دوتا فیلد ..بعد از کانورت به int32 کلا میره تو متد و میمونه و این پیام رو میده انتهای متد:
System.FormatException: 'Input string was not in a correct format.'

ShayanFiroozi
دوشنبه 09 تیر 1399, 00:25 صبح
به این دلیله که متد Convert.ToIn32 نمیتونه هر رشته ای رو به عدد تبدیل کنه مثلا رشته "ABCD" رو به چه عددی تبدیل کنه ؟

شما راحتترین و اصولی ترین کارتون اینه که کد های ملی رو با فرمت string ذخیره کنین ، هم راحت تره هم کاملا Safe هستش.

اگر دیتابیس به درستی طراحی نشده بهتره درستش کنین ، میتونین اون جدول رو Drop And Create کنین ، فقط قبلش بک آپ بگیرین.
ضمنا برای تعداد فرزندان درست اینه که مقدار عددی باشه ، چرا ؟ چون ممکنه روزی عملیات ریاضی بخواین انجام بدین ، مثلا جمع تعداد فرزندان کارمند ها یا هر چیز دیگه.
ولی در خصوص کد ملی اینطور نیست ، فقط یه رشته 10 رقمی از اعداده همین ، رشته میتونه کلید Unique هم باشه ، پس فیلد کد ملی شما میتونه از نوع رشته یا nvarchar(10) باشه و همزمان کلید و Unique باشه.

منصور54
دوشنبه 09 تیر 1399, 12:13 عصر
شایان جان ببخشید . کد ملی رو گذاشتم nvarchar(10) حالا بازم باید کانورت کنم .تعداد فرزندان و هم int گذاشتم ..

ShayanFiroozi
دوشنبه 09 تیر 1399, 15:59 عصر
اگر نوع فیلد مبدا از نوع رشته ای هست خیر ولی خوب به هر حال انتهای رشته یعنی جایی که داده رو به فیلد مقداد میدید یه .ToString() هم بذارید بد نیست.