ورود

View Full Version : سوال: به روز رسانی یک سلول از جدول (LINQ)



hadimtn
یک شنبه 20 اردیبهشت 1394, 16:21 عصر
سلام.
یه سلول از جدول رو چه جوری باید ویرایش کنم؟!
میخوام اگر "نام" و "نام خانوادگی" تکراری بودن، سلول " تاریخ " مربوط به اون رکورد به روز بشه.


var db = new LTSCDataContext();
var ItemChecker = db.LinqTables.SingleOrDefault(r => r.Name == txt_name.Text & r.Family_Name == txt_fname.Text);
if (ItemChecker == null)
{
string _name = txt_name.Text;
string _fname = txt_fname.Text;
string _regdate = dateTimePickerX1.GetSelectedDateInPersianDateTime( ).ToShortDateString();
LinqTable tb = new LinqTable()
{
Name = _name,
Family_Name = _fname,
RegDate = DateTime.Parse(_regdate)
};
db.LinqTables.InsertOnSubmit(tb);
db.SubmitChanges();
dataGridView1.DataSource = db.LinqTables;
MessageBox.Show("Insert", "Result");
}

else
{

PersianCalendar pc = new PersianCalendar();
string _TodeyDate = pc.GetYear(DateTime.Now) + "/" + pc.GetMonth(DateTime.Now) + "/" + pc.GetDayOfMonth(DateTime.Now);

var result = (from u in db.LinqTables
where u.PassageDate == DateTime.Parse(_TodeyDate)
select u).First();
db.SubmitChanges();
MessageBox.Show("Update!!!", "Result");
}



قسمت else که مربوط به Update کردن یک سلول از جدوله چه جوری باید باشه؟!؟!

Mahmoud.Afrad
دوشنبه 21 اردیبهشت 1394, 02:41 صبح
کافیه در else پراپرتی شئ رو مقداردهی کنی.

var db = new LTSCDataContext();
var ItemChecker = db.LinqTables.SingleOrDefault(r => r.Name == txt_name.Text & r.Family_Name == txt_fname.Text);
if (ItemChecker == null)
{
string _name = txt_name.Text;
string _fname = txt_fname.Text;
string _regdate = dateTimePickerX1.GetSelectedDateInPersianDateTime( ).ToShortDateString();
LinqTable tb = new LinqTable()
{
Name = _name,
Family_Name = _fname,
RegDate = DateTime.Parse(_regdate) ////////// <=========
};
db.LinqTables.InsertOnSubmit(tb);
db.SubmitChanges();
dataGridView1.DataSource = db.LinqTables;
MessageBox.Show("Insert", "Result");
}
else
{
ItemChecker.PassageDate = DateTime.Now;
db.SubmitChanges();
MessageBox.Show("Update!!!", "Result");
}


در ضمن
اگر RegDate و PassageDate از نوع datetime هستند، باید تاریخ میلادی درشون ذخیره بشه (اگر GetSelectedDateInPersianDateTime از نوع datetime هست که هیچ اگر نیست باید به میلادی تبدیل بشه. در مورد PassageDate هم نیازی نیست تاریخ میلادی به شمسی تبدیل و بعد دوباره سعی کنی به میلادی تبدیلش کنی)
اگر هم تاریخها از نوع رشته هستند کافیه تاریخ شمسی رو به صورت رشته ذخیره کنی.(نیازی به DateTime.Parse نیست)

hadimtn
دوشنبه 21 اردیبهشت 1394, 12:08 عصر
اگر RegDate و PassageDate از نوع datetime هستند، باید تاریخ میلادی درشون ذخیره بشه (اگر GetSelectedDateInPersianDateTime از نوع datetime هست که هیچ اگر نیست باید به میلادی تبدیل بشه. در مورد PassageDate هم نیازی نیست تاریخ میلادی به شمسی تبدیل و بعد دوباره سعی کنی به میلادی تبدیلش کنی)
اگر هم تاریخها از نوع رشته هستند کافیه تاریخ شمسی رو به صورت رشته ذخیره کنی.(نیازی به DateTime.Parse نیست)
نوع داده ی datetime2 رو انتخاب کردم که شمسی هم توش ذخیره بشه. در واقع میخوام همه ی تاریخ ها رو شمسی ذخیره کنم. (هر چند نمیدونم اصلا کوئری روی تاریخ ها چه جوری انجام میشه!!!)

131107

همینطور که مشاهده میکنید بلافاصله بعد از درج اطلاعات، کاربر تاریخ رو مشاهده خواهد کرد پس باید شمسی ذخیره بشه.
البته یکی از دوستان پیشنهاد کرد که هم شمسی ذخیره کن، هم میلادی! شمسی رو به کاربر نشون بده، میلادی رو هم توی کوئری ها استفاده کن. ولی بنده همچنان اسرار دارم فقط شمسی ذخیره کنم!

1. نظرتون راجع به کاری که میخوام انجام بدم بگین.
2. فرمت تاریخ رو چه جوری میتونم عوض کنم؟! 2/21/1393 رو به شکل: 21/02/1393 نشون بده!

Mahmoud.Afrad
سه شنبه 22 اردیبهشت 1394, 01:06 صبح
شما نمیتونید تاریخ شمسی رو در قالب میلادی ذخیره کنید بلکه باید به میلادی تبدیل کرده و بعد ذخیره کنید. برای نمایش به کاربر کافیه تاریخ میلادی رو به شمسی تبدیل کرده و نمایش داد. در این حالت میتونی از مقایسه تاریخ استفاده کنی.

یا اینکه نوع ستونهای تاریخ رو از نوع varchar(8) انتخاب کنی(بدون /) که در اینصورت باید روز و ماه به صورت دورقمی و سال چهاررقمی به صورت yyyymmdd ذخیره کنی.

hadimtn
سه شنبه 22 اردیبهشت 1394, 11:53 صبح
شما نمیتونید تاریخ شمسی رو در قالب میلادی ذخیره کنید بلکه باید به میلادی تبدیل کرده و بعد ذخیره کنید. برای نمایش به کاربر کافیه تاریخ میلادی رو به شمسی تبدیل کرده و نمایش داد. در این حالت میتونی از مقایسه تاریخ استفاده کنی.
این حالتی که با datetime2 تاریخ شمسی رو قبول کرده و تو پایگاه داده ذخیره شده مشکلی پیش میاد؟! بی زحمت یه نوع کوئری تاریخ (LINQ) بدین تا امتحان کنم. مثلا یکی از رکوردهای همون جدول بالا چند روزه تو سیستم درج شده؟ (سال، ماه، روز)

یا اینکه نوع ستونهای تاریخ رو از نوع varchar(8) انتخاب کنی(بدون /) که در اینصورت باید روز و ماه به صورت دورقمی و سال چهاررقمی به صورت yyyymmdd ذخیره کنی.
فکر نکنم کار جالبی باشه! :متفکر:

Mahmoud.Afrad
سه شنبه 22 اردیبهشت 1394, 17:31 عصر
این حالتی که با datetime2 تاریخ شمسی رو قبول کرده و تو پایگاه داده ذخیره شده مشکلی پیش میاد؟!
قطعا مشکل پیش میاد. کلاس datetime ظرفی برای نگهداری تاریخ میلادی هست. حالا اگر یک تاریخ که به نظر شما شمسی هست رو در این ظرف بریزید دیگه اون تاریخ شمسی نخواهد بود. مثلا رشته (تاریخ امروز به شمسی) "1394/02/22" رو اگر با متد Parse از کلاس datetime به تاریخ تبدیل کنید به روز 22 از ماه دوم از سال 1394 میلادی اشاره خواهد کرد نه شمسی.
مشکل دیگر هم اینه که شما نمیتونید تاریخ "1394/04/31" رو با متد Parse به نوع datetime تبدیل کنید چون در میلادی در ماه چهارم روز 31 وجود نداره.
مشکل دیگه هم در محاسبات پیش خواهد اومد که بزرگترین مشکل شماست. تعداد روزها در هر ماه در تاریخ میلادی مثلا در ماه چهارم میلادی با تعداد روز در ماه چهارم شمسی یکی نیست و قطعا در محاسبات (مخصوصا محاسبات مالی) دچار مشکل خواهید شد.

چون داری linq کار میکنی بهترین کار تبدیل تاریخهای شمسی به میلادی و ذخیره اونها هست. چون در linq خیلی راحت میتونی مقایسه یا تبدیلات لازم رو انجام بدی.



در مورد اینکه نوع ستون تاریخ از نوع رشته باشه هم تا حدی مشکل نخواهید داشت مگر بخواهید اختلاف دو تاریخ رو بدست بیارید که در اینصورت سربار پردازشی برای تبدیل رشته به تاریخ خواهید داشت.