PDA

View Full Version : سوال: خالی رد کردن تاریخ در دیتابیس



booysusa
دوشنبه 20 خرداد 1398, 21:07 عصر
درود دوستان
میخوام اینو درست کنم ولی نمی دونم تیکه کد تاریخ رو خالی بفرستم توی دیتابیس یا مثلا چطوری میشه تاریخ همین روز رو درون دیتابیس درج کنم
الان اگر توجه کنید میبینید که من String رو تونستم خالی بفرستم توی دیتابیس ولی Date رو نمیدونم چطوری بنویسم


http://s5.picofile.com/file/8363188818/09.png


کد من:



public bool InsertHesab() // افزودن بخش حساب
{
string command = @"INSERT into [Hesab] (Dasteh_Hesab, Mozo_Hesab, Baha_Hesab, Tarikh_Hesab, Tozihat_Hesab, Contact_ID) " +
"values (@Dasteh_Hesab, @Mozo_Hesab, @Baha_Hesab, @Tarikh_Hesab, @Tozihat_Hesab, @Contact_ID)";

List<SqlParameter> parametersList = new List<SqlParameter>();

var Dasteh_HesabParameter = new SqlParameter("@Dasteh_Hesab", string.IsNullOrEmpty(this.Dasteh_Hesab) ? string.Empty : this.Dasteh_Hesab);
var Mozo_HesabParameter = new SqlParameter("@Mozo_Hesab", string.IsNullOrEmpty(this.Mozo_Hesab) ? string.Empty : this.Mozo_Hesab);
var Baha_HesabParameter = new SqlParameter("@Baha_Hesab", string.IsNullOrEmpty(this.Baha_Hesab) ? string.Empty : this.Baha_Hesab);
//var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", this.Tarikh_Hesab);

var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", Convert.ToDateTime(Tarikh_Hesab));
var Tozihat_HesabParameter = new SqlParameter("@Tozihat_Hesab", string.IsNullOrEmpty(this.Tozihat_Hesab) ? string.Empty : this.Tozihat_Hesab);
var idParameter = new SqlParameter("@Contact_ID", ID);

parametersList.Add(Dasteh_HesabParameter);
parametersList.Add(Mozo_HesabParameter);
parametersList.Add(Baha_HesabParameter);
parametersList.Add(Tarikh_HesabParameter);
parametersList.Add(Tozihat_HesabParameter);
parametersList.Add(idParameter);

var db = new DataAccess.DatabaseManager();
var result = db.ExecuteCommand(command, parametersList);
return result;
}





مشخصات برنامه:
ویژوال استودیو
سی شارپ
دیتابیس sql

Mahmoud.Afrad
دوشنبه 20 خرداد 1398, 23:05 عصر
چک کنید اگر تاریخ وارد نشده بود null ارسال کنید و در غیر اینصورت تاریخ را. بستگی داره Tarikh_Hesab چی هست.
var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", Tarikh_Hesab == null ? DBNull.Value : Convert.ToDateTime(Tarikh_Hesab));

booysusa
سه شنبه 21 خرداد 1398, 15:01 عصر
چک کنید اگر تاریخ وارد نشده بود null ارسال کنید و در غیر اینصورت تاریخ را. بستگی داره Tarikh_Hesab چی هست.
var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", Tarikh_Hesab == null ? DBNull.Value : Convert.ToDateTime(Tarikh_Hesab));

مهندس این خطا رو میده
میخوام هیچی تو دیتابیس ذخیره نشه ، منظورم Null هست، باید هیچی تو دیتابیس ذخیره نشه
http://s3.picofile.com/file/8363258334/01.png

Mahmoud.Afrad
سه شنبه 21 خرداد 1398, 18:00 عصر
DBNull.Value را به جاش null بزارید

booysusa
چهارشنبه 22 خرداد 1398, 11:17 صبح
DBNull.Value را به جاش null بزارید

ببخشید بابت طولانی شدن این سوال مبتدیانه
این خطا رو میده

http://s4.picofile.com/file/8363340976/02.png

danialafshari
چهارشنبه 22 خرداد 1398, 13:22 عصر
پست بالا رو دقیق دقت کنید قسمت اول شرط رو ننوشتید
Tarikh_Hesab == null ? null : Convert.ToDateTime(Tarikh_Hesab)

booysusa
چهارشنبه 22 خرداد 1398, 17:51 عصر
پست بالا رو دقیق دقت کنید قسمت اول شرط رو ننوشتید
Tarikh_Hesab == null ? null : Convert.ToDateTime(Tarikh_Hesab)


اون null null رو قبلا انجام دادم بازم نشد:عصبانی++:
این خطا رو میده

http://s3.picofile.com/file/8363383576/03.png




مهندس لینک زیر رو مطالعه میکنید، ببینید چیزی دستگیرتون میشه یا نه؟
لینک (https://www.google.com/search?client=firefox-b-d&q=type+of+conditional+expression+cannotr+be+determ inde+becase+iss+no+implicit+conversion+between+%27 %3Cnull%3E%27+and+%27DateTime%27)

davidrobert
چهارشنبه 22 خرداد 1398, 19:16 عصر
من برای تاریخ میلادی اگه تاریخ نباشه موقع ذخیره این نوشتم خوب هم عمل میکنه چه برای نمایش معادل این نوشتم چه ذخیره و یا ویرایش
insert Dates values (CASE WHEN @Dates IS NULL THEN Getdate() WHEN Dates IS NOT NULL THEN @Dates END) from table1

booysusa
چهارشنبه 22 خرداد 1398, 19:23 عصر
من برای تاریخ میلادی اگه تاریخ نباشه موقع ذخیره این نوشتم خوب هم عمل میکنه چه برای نمایش معادل این نوشتم چه ذخیره و یا ویرایش
insert Dates values (CASE WHEN @Dates IS NULL THEN Getdate() WHEN Dates IS NOT NULL THEN @Dates END) from table1

فعلا این نوع کدنویسی شما رو بلد نیستم متاسفانه
(یه جورایی تو کدنویسی زبان سی شارپ مبتدی ایم:اشتباه:)

Mahmoud.Afrad
چهارشنبه 22 خرداد 1398, 22:03 عصر
null را به object تبدیل کنید
... ? (object) null : ...
یا اینکه کلا با if ... else شرط را بررسی و مقدار پارامتر را ست کنید.

booysusa
پنج شنبه 23 خرداد 1398, 12:02 عصر
null را به object تبدیل کنید
... ? (object) null : ...
یا اینکه کلا با if ... else شرط را بررسی و مقدار پارامتر را ست کنید.

سپاسگزارم
درست شد


var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", Tarikh_Hesab == null ? (object)null : (Tarikh_Hesab));



سوال اول
فقط الان این خطا رو میده
با وجود این خطا ولی اطلاعات در دیتابیس ذخیره میشن

و سوال دومم
من میدونم چطوری تاریخ شمسی رو در دیتابیس ذخیره کنم و به خوبی هم تاریخ شمسی رو در گرید ویوو نمایش میدم وکلا با تبدیل تاریخ مشکلی ندارم، ولی نگران هزینه کرد آینده هستم
مهندس بنظرتون از String برای تاریخ استفاده کنم یا همین Date استفاده کنم؟

http://s4.picofile.com/file/8363448742/04.png

danialafshari
پنج شنبه 23 خرداد 1398, 13:14 عصر
سپاسگزارم
درست شد


var Tarikh_HesabParameter = new SqlParameter("@Tarikh_Hesab", Tarikh_Hesab == null ? (object)null : (Tarikh_Hesab));



سوال اول
فقط الان این خطا رو میده
با وجود این خطا ولی اطلاعات در دیتابیس ذخیره میشن

و سوال دومم
من میدونم چطوری تاریخ شمسی رو در دیتابیس ذخیره کنم و به خوبی هم تاریخ شمسی رو در گرید ویوو نمایش میدم وکلا با تبدیل تاریخ مشکلی ندارم، ولی نگران هزینه کرد آینده هستم
مهندس بنظرتون از String برای تاریخ استفاده کنم یا همین Date استفاده کنم؟

http://s4.picofile.com/file/8363448742/04.png

خطا مشخصه میگه تاریخ باید بین اون تاریخ های مشخص شده در خطا باشه
قبل از ایجاد تاپیک جستجو کنید
قبلاً گفته شده که توصیه نمیشه تاریخ شمسی رو در نوع date دیتابیس ذخیره کرد میتونید بصورت میلادی ذخیره و در برنامه تبدیل کنید اگر از nvarchar هم استفاده کنید مشکلی پیش نمیاد

booysusa
پنج شنبه 23 خرداد 1398, 22:33 عصر
خطا مشخصه میگه تاریخ باید بین اون تاریخ های مشخص شده در خطا باشه
قبل از ایجاد تاپیک جستجو کنید
قبلاً گفته شده که توصیه نمیشه تاریخ شمسی رو در نوع date دیتابیس ذخیره کرد میتونید بصورت میلادی ذخیره و در برنامه تبدیل کنید اگر از nvarchar هم استفاده کنید مشکلی پیش نمیاد

سپاسگزارم مهندس
nvarchar استفاده کردم ، در آینده مشکلی برای کار بر روی تاریخ پیش نمیاد؟
مثلا گزارش گیری و یا جستجو بین دوتاریخ و....

danialafshari
پنج شنبه 23 خرداد 1398, 23:28 عصر
سپاسگزارم مهندس
nvarchar استفاده کردم ، در آینده مشکلی برای کار بر روی تاریخ پیش نمیاد؟
مثلا گزارش گیری و یا جستجو بین دوتاریخ و....
خیر پیش نمیاد

davidrobert
جمعه 24 خرداد 1398, 00:15 صبح
سپاسگزارم مهندس
nvarchar استفاده کردم ، در آینده مشکلی برای کار بر روی تاریخ پیش نمیاد؟
مثلا گزارش گیری و یا جستجو بین دوتاریخ و....

اگه گزارش خاص باشه چرا مشکل پیش میاد برای جای که برنامه نوشته بودم همه تاریخ ها شمسی ذخیره میکردم در nvarchar ولی حالت های مختلف گزارش نموداری بر حسب تاریخ برحسب بلوغ، جنسیت که هر لحظه به صورت نموداری بر حسب سال نشان بده از کدام سال یا ماه و یا هفته یا روز نشان بده امار نموداری چون تاریخ شمسی بود برنامه بنده با مشکل خورد بخاطر همین مجبور شدم برنامه در حال کار بود و کلی اطلاعات داشت سر گزارشات مشتری همه فیلد ها شمسی به میلادی در یک دیتابیس جدید قرار بدم و موقع انتقال از دیتابیس اول به دوم کلی فقط Script نویسی کردم که تو یک ثانیه همه اطلاعات از دیتابیس قدیم به دیتابیس جدید بدم تا برنامه با تاریخ میلادی ثبت بشه و گزارشات میلادی بررسی کنه و تاریخ شمسی نشان بده. بعضی موقع واقعا تاریخ شمسی دست پا آدم میبنده ولی میلادی چون استانداردش هستش نه با مشکل بر نمیخورید تو گزارشات

booysusa
جمعه 24 خرداد 1398, 14:59 عصر
اگه گزارش خاص باشه چرا مشکل پیش میاد برای جای که برنامه نوشته بودم همه تاریخ ها شمسی ذخیره میکردم در nvarchar ولی حالت های مختلف گزارش نموداری بر حسب تاریخ برحسب بلوغ، جنسیت که هر لحظه به صورت نموداری بر حسب سال نشان بده از کدام سال یا ماه و یا هفته یا روز نشان بده امار نموداری چون تاریخ شمسی بود برنامه بنده با مشکل خورد بخاطر همین مجبور شدم برنامه در حال کار بود و کلی اطلاعات داشت سر گزارشات مشتری همه فیلد ها شمسی به میلادی در یک دیتابیس جدید قرار بدم و موقع انتقال از دیتابیس اول به دوم کلی فقط Script نویسی کردم که تو یک ثانیه همه اطلاعات از دیتابیس قدیم به دیتابیس جدید بدم تا برنامه با تاریخ میلادی ثبت بشه و گزارشات میلادی بررسی کنه و تاریخ شمسی نشان بده. بعضی موقع واقعا تاریخ شمسی دست پا آدم میبنده ولی میلادی چون استانداردش هستش نه با مشکل بر نمیخورید تو گزارشات

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

davidrobert
شنبه 25 خرداد 1398, 08:28 صبح
برای اینکه به مشکل نخورم، صفحه اول که ارسال اطلاعات بر پایه تاریخ شمسی به میلادی هست رو Date قرار میدم چون به مشکل بر نمی خورم و همیشه یک تاریخ هست که دیتابیس ارسال شود، و برای باقی صفحات غیرمهم بجای استفاده از Date از nvarcvar استفاده می کنم
سپاس بابت راهنمایی همه مهندسین عزیز
شما میتوانید دیتابیس تاریخ ها میلادی قرار بدید همه رو و توسط Function قبل از ذخیره تاریخ شمسی تبدیل کنید به میلادی و موقع نمایش قبل از نمایش تاریخ میلادی به شمسی تبدیل کنید توسط اسکیول سرور.مشکلی که توسط ویندوز 10 به وجود امده چون ویندوز 10 و سرور های جدید تاریخ اش شمسی و تو برنامه چه تحت شبکه و یا Single موقع پاس دادن تاریخ میلادی مستقیم اگه ویندوز 10 باشه و شما بگید 2019-01-01 اسکیول سرور فکر میکنه دارید میگید تاریخ 2019-01-01 شمسی هستش پس خود اسکیول سرور تبدیل به میلادی کنه که تاریخ میشه 2659-05-01 میشه گفت 600 سال تاریخ میبره جلو چه مستقیم و یا با برنامه بفرستید تاریخ میلادی در ویندوزی که تاریخ شمسی داره اتوماتیک خودش تبدیل تاریخ انجام میده ولی وقتی از Function استفاده کنید مشکلی پیش نمیاد این مشکل روی نوع فیلد Date هستش و تاریخ شمسی سیستم.