ورود

View Full Version : سوال: ذخیره جنسیت



jeson_park
سه شنبه 07 خرداد 1392, 17:36 عصر
سلام
برای ذخیره جنسیت در برنامم می خوام از enum استفاده کنم
یه enum ساختم


public enum Gender
{
Male = 1,
Female = 2
}


میخواستم بدونم این رو باید به چه صورت در بانک اطلاعاتی ذخیره کنم؟؟
آیا باید از نوع داده bit در Sql server استفاده کنم؟؟
اگه جواب آره هست موقع واکشی چه طوری نمایشش بدمم؟؟؟

raziee
سه شنبه 07 خرداد 1392, 19:24 عصر
enum به صصورت پیش فرض شمارنده ای از نوع int هست که در صورت نیاز قابل تغییر هم هست.
به طور مثال :

// enum initialization:
using System;
public class EnumTest
{
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

public static void Main()
{
int x = (int) Days.Sun;
int y = (int) Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
و یا :
using System;
public class EnumTest
{
enum Range :long {Max = 2147483648L, Min = 255L};
public static void Main()
{
long x = (long) Range.Max;
long y = (long) Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
برای اطلاعات بیشتر : + (http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.71).aspx) و + (http://msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx) و + (http://www.dotnetperls.com/enum)

jeson_park
سه شنبه 07 خرداد 1392, 21:17 عصر
ممنون این ها رو می دونم تا حدودی
سوال من چیز دیگه ای بود
می خواستم بدونم جنسیت رو چه طوری باید توی دیتابیس ذخیره و بازیابی کنم؟؟
مثلا موقع بازیابی با یه دستور if چک کنم اگه 1 بود مقدارش مرد باشه اگه 0 بود زن؟؟؟
شما راه حل بهتری دارید؟؟

amirsajjadi
سه شنبه 07 خرداد 1392, 22:14 عصر
ممنون این ها رو می دونم تا حدودی
سوال من چیز دیگه ای بود
می خواستم بدونم جنسیت رو چه طوری باید توی دیتابیس ذخیره و بازیابی کنم؟؟
مثلا موقع بازیابی با یه دستور if چک کنم اگه 1 بود مقدارش مرد باشه اگه 0 بود زن؟؟؟
شما راه حل بهتری دارید؟؟

سلام دوست عزیز
بله بهتره از bit استفاده کنید. enum رو هم از نوع بایت بگیرید و مثلا مونث رو بگیرید 0 و مذکر رو 1. وقتی که داده رو از بانک بخونید و به enum نسبت بدید اتوماتیک 0 به معنی false و 1 به معنی true میشه.

BookWorm
چهارشنبه 08 خرداد 1392, 10:01 صبح
بله به قول دوستان بهترین روش ذخیره همون bit هست و برای واکشی اطلاعات از دو روش میتونی استفاده کنی یکی در خود Select SQl که از درستور case برای انتخاب نوشته متن مرد یا زن استفاده کنی و روش دیگری که توصیه بنده است اگر از کنترل gridview استفاده میکنی نوشتن کد در rowdatabind و تبدیل e.cell[x].text به مقداری که میخوای هست.

alihassanabadi
چهارشنبه 08 خرداد 1392, 10:29 صبح
سلام
نظر همه دوستان محترمه
ولی تقریبا اشتباه (اصلا مگه میشه true=Male,False=Female یا برعکس) شما باید از نوع int یا smallint در نظر بگیرید شما فرض کنید enum شما از دو حالت بیشتر باشه
مثل Female,Male,Other حالا دیگه bit جواب نمیده
و به همون روشی که آقای raziee فرمودند parse کنید به enum.

amirsajjadi
چهارشنبه 08 خرداد 1392, 12:37 عصر
سلام
نظر همه دوستان محترمه
ولی تقریبا اشتباه (اصلا مگه میشه true=Male,False=Female یا برعکس) شما باید از نوع int یا smallint در نظر بگیرید شما فرض کنید enum شما از دو حالت بیشتر باشه
مثل Female,Male,Other حالا دیگه bit جواب نمیده
و به همون روشی که آقای raziee فرمودند parse کنید به enum.

میشه برای حالت سوم null رو در نظر گرفت

alihassanabadi
چهارشنبه 08 خرداد 1392, 13:41 عصر
میشه برای حالت سوم null رو در نظر گرفت
کلا حل این مساله با بیت کار اشتباهیه.

amirsajjadi
چهارشنبه 08 خرداد 1392, 17:35 عصر
کلا حل این مساله با بیت کار اشتباهیه.

مگه چندتا جنسیت داریم !!!!!؟ یه مرده، یه زن، به گفته شما یه دیگر موارد هم هست!
دلیل اینکه میگید اشتباهه رو هم بگید تا ما بهتر بفهمیم.

sanaz.dadkhah
چهارشنبه 08 خرداد 1392, 21:44 عصر
جناب آقای amirsajjadi حتما که نباید در اینجا ذکر شود بله یک other هم نیاز است.اگر به دید درست نگاه کنیم.مرد و زن و هرمافرودیسم

fakhravari
پنج شنبه 09 خرداد 1392, 00:22 صبح
other جنسیت هم هست:لبخندساده:.
این همه کار برای یه فیلد جنسیت!
بهتره bit باشه حجم کمتری میگیره

alihassanabadi
پنج شنبه 09 خرداد 1392, 13:28 عصر
درورد بر همگی.

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

مگه چندتا جنسیت داریم !!!!!؟ یه مرده، یه زن، به گفته شما یه دیگر موارد هم هست!
1- sanaz.dadkhah (http://barnamenevis.org/member.php?235074-sanaz.dadkhah) زحمت کشیدن جواب شما رو دادن.


other جنسیت هم هست:لبخندساده:.
2- وقتی sanaz.dadkhah (http://barnamenevis.org/member.php?235074-sanaz.dadkhah) جواب دادن نباید میپرسیدی, other جنسیت نیست ولی جز موارد دیگر حساب میشه.

این همه کار برای یه فیلد جنسیت!کدوم کار؟ کار خاصی نداره.

بهتره bit باشه حجم کمتری میگیره3- شما نگران حجم کم و زیاد نباشید چون زحمتشو sql میکشه و چون
4- tinyint یک بایت مصرف میکنه در صورتی که bit هم یک بایت و smallint دو بایت حالا tinyint کجا و bit کجا
5-مشکل شما که میگید bit اینه که نمیخواید قبول کنید
ما نمیتونیم برای جنسیت True و False در نظر بگیریم آقا کجای دنیا دیدید به مذکر بگن true بعد به مونث بگن false یا برعکسش!
کلا فکر این هم نباشید که مثلا برای خودتون قرارداد میبندید که T=female یا F=male چون برنامه نویس بعدی که بخواد پروژتون رو ارتقا بده حسابی میخنده
اینو تو StackOverFlow.com مطرح کن اونموقع میبینی چندتا امتیاز منفی برات صادر میشه
در کل دوست عزیزی که این سوال رو پرسیدی اگه واقعا میخوای داده هات با معنی بشه
بهتره از char(1) استفاده کنی خیلی هم با معنی میشه و فقط 1 بایت میگیره F,M,O و.. و در کل کارکترها مفهوم جنسیت رو به وضوح میرسونه,
وقتی یک کوئری رو تیبلت بزنی رکوردهای با معنی میبینی نه مجموعه ای از true,false ها یا 0,1 ها
اگه بازم موضوع براتون روشن نشده بگین یه جور دیگه توضیح میدم.

amirsajjadi
پنج شنبه 09 خرداد 1392, 13:38 عصر
درورد بر همگی.
نشنیده بودم ولی در کل میدونم از 2 نوع بیشتره.

1- sanaz.dadkhah (http://barnamenevis.org/member.php?235074-sanaz.dadkhah) زحمت کشیدن جواب شما رو دادن.

2- وقتی sanaz.dadkhah (http://barnamenevis.org/member.php?235074-sanaz.dadkhah) جواب دادن شما دیگه نباید میپرسیدی.

کدوم کار؟ کار خاصی نداره.

3- چون شما میگید چشم, شما نگران حجم کم و زیاد نباشید چون زحمتشو sql میکشه
4- tinyint یک بایت مصرف میکنه در صورتی که bit هم یک بایت و smallint دو بایت حالا tinyint کجا و bit کجا
5-مشکل شما که میگید bit اینه که نمیخواید قبول کنید
ما نمیتونیم برای جنسیت True و False در نظر بگیریم آقا کجای دنیا دیدید به مذکر بگن true بعد به مونث بگن false یا برعکسش!
کلا فکر این هم نباشید که مثلا برای خودتون قرارداد میبندید که T=female یا F=male چون برنامه نویس بعدی که بخواد پروژتون رو ارتقا بده حسابی میخنده
اینو تو StackOverFlow.com مطرح کن اونموقع میبینی چندتا امتیاز منفی برات صادر میشه
در کل دوست عزیزی که این سوال رو پرسیدی اگه واقعا میخوای داده هات با معنی بشه
بهتره از char(1) استفاده کنی خیلی هم با معنی میشه وقتی یک کوئری رو تیبلت بزنی رکوردهای با معنی میبینی نه مجموعه ای از true,false ها یا 0,1 ها
اگه بازم موضوع براتون روشن نشده بگین یه جور دیگه توضیح میدم.

احسنت به این همه اطلاعاتی که دارید. :لبخندساده:

tooraj_azizi_1035
پنج شنبه 09 خرداد 1392, 17:21 عصر
4- tinyint یک بایت مصرف میکنه در صورتی که bit هم یک بایت و smallint دو بایت حالا tinyint کجا و bit کجاSQL Server برای 8 بیت یک بایت مصرف میکنه و از 9 بایت به بعد وارد مد استفاده از 2 بایت میشه.


5-مشکل شما که میگید bit اینه که نمیخواید قبول کنید
ما نمیتونیم برای جنسیت True و False در نظر بگیریم آقا کجای دنیا دیدید به مذکر بگن true بعد به مونث بگن false یا برعکسش!یعنی شما از ساختار داخلی دیتابیس های دنیا باخبرید؟
این شکل استفاده عمومیت نداره ولی در دیتابیسی مثل AdventureWorks برای فیلد Gender نوع char انتخاب شده.



کلا فکر این هم نباشید که مثلا برای خودتون قرارداد میبندید که T=female یا F=male چون برنامه نویس بعدی که بخواد پروژتون رو ارتقا بده حسابی میخنده
اینو تو StackOverFlow.com مطرح کن اونموقع میبینی چندتا امتیاز منفی برات صادر میشه
اون برنامه نویس احتمالاً حس خودبرتر بینی بالایی داره که میخنده.
در StackOverFlow اونقدر هست که بیا و ببین: http://stackoverflow.com/questions/4175878/storing-sex-gender-in-database


در کل دوست عزیزی که این سوال رو پرسیدی اگه واقعا میخوای داده هات با معنی بشه
بهتره از char(1) استفاده کنی خیلی هم با معنی میشه و فقط 1 بایت میگیره F,M,O و.. و در کل کارکترها مفهوم جنسیت رو به وضوح میرسونه,
وقتی یک کوئری رو تیبلت بزنی رکوردهای با معنی میبینی نه مجموعه ای از true,false ها یا 0,1 ها
CASE WHEN رو برای معنی دار کردن خروجی گذاشتن:


CASE ebv.db_no WHEN 22978 OR 23218 OR 23219 THEN 'WECS 9500'
ELSE 'WECS 9520'
END as wecs_system

jeson_park
جمعه 10 خرداد 1392, 07:48 صبح
آقا دعوا نکنید
چون پروژه بزرگ نیست من از همون varchar استفاده کردم
اینطوری که استاندارد ISO 5218 (http://en.wikipedia.org/wiki/ISO_5218) می گه باید 4 حالت داشته باشیم :



0 = not known,
1 = male,
2 = female,
9 = not applicable.

و در اخر اینکه اگه توی SO بودین الان همه بن شده بودین!:بامزه:
ممنون

alihassanabadi
شنبه 11 خرداد 1392, 10:00 صبح
SQL Server برای 8 بیت یک بایت مصرف میکنه و از 9 بایت به بعد وارد مد استفاده از 2 بایت میشه.از 9 بیت به بعد
خب آره ولی دلیلی برای نقل قول کردن مورد 4 نیست.

یعنی شما از ساختار داخلی دیتابیس های دنیا باخبرید؟
این شکل استفاده عمومیت نداره ولی در دیتابیسی مثل AdventureWorks برای فیلد Gender نوع char انتخاب شده.
من که آخرش گفتم که همون char بهترین حالته


در StackOverFlow اونقدر هست که بیا و ببین: http://stackoverflow.com/questions/4...er-in-database (http://stackoverflow.com/questions/4175878/storing-sex-gender-in-database)حتما اینجا رو هم مطالعه کردید
Conclusion

I would use Option 2: CHAR(1).



CASE WHEN رو برای معنی دار کردن خروجی گذاشتنلقمه رو از پشت سر نمیخورن
وقتی میشه بیس کار رو درست چید که نیازی به case نباشه, من یه select ساده میزنم و اطلاعات معنی دار میبینم .

alihassanabadi
شنبه 11 خرداد 1392, 10:03 صبح
احسنت به این همه اطلاعاتی که دارید. :لبخندساده:
و احسنت به شما مهندس :لبخندساده: