دسته بندی ها
19:04 1399/02/21

عدم ذخیره تغییرات داده ها در دیتابیس

مشخصات سوال کننده :
کاربر : Mfarahmand     امتیاز کاربر : 20     رتبه کاربر : 36
دسته بندی : سی شارپ WPF

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2751
پاسخ دهنده : Mfarahmand 10:12 1399/02/22

آخه قبلا این کدها مشکلی نداشتند و تغییرات انجام می شد

 private void btn_ok_Click(object sender, RoutedEventArgs e)
        {
            if (!checkNullable())
            {
                return;
            }
            using (TransactionScope TS = new TransactionScope())
            {
                try
                {
                    switch (win_Type)
                    {
                        case 1:
                            {///////////////InsertBlock
                                if (imgName != null)
                                {
                                    /////////////////دستورات تبدیل تصویر به رشته برای ذخیره در دیتابیس
                                    FileStream fs = new FileStream(imgName, FileMode.Open, FileAccess.Read);
                                    byte[] imgByteArr = new byte[fs.Length];
                                    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
                                    fs.Close();
                                    partimage = imgByteArr;
                                }
                                else
                                {
                                    partimage = null;
                                }
                                //////////////////////////////////چک کردن اینکه آیا این رجیستر پارت از قبل وجود دارد یا خیر
                                var result = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                if (result.Count > 0)
                                {
                                    MessageBox.Show("این رجیستر از قبل وجود دارد و تکراری است، لطفا رشته دیگری را وارد کنید.");
                                    txt_Register.Focus();
                                    return;
                                }
                                /////////////////////////////تعیین شرط محدودیت دسترسی به انبار برای کاربران
                                if (cmb_Store.SelectedIndex + 1 != PublicVariables.gStoreID && PublicVariables.gStoreID != 1)
                                {
                                    MessageBox.Show("به جهت محدودیت دسترسی کاربر، مجاز به تعریف پارت انبار انتخاب شده نمی باشید. لطفا انبار مورد دسترس با نام کاربری خود را وارد نمایید.", "محدودیت دسترسی", MessageBoxButton.OK, MessageBoxImage.Warning);
                                    cmb_Store.Focus();
                                    return;
                                }
                                /////////////////////////////////////////////////////////ثبت پارت جدید

                                if (txt_Interval.Text != "")
                                { PartInsIntrv = Convert.ToInt32(txt_Interval.Text.Trim()); }
                                else { PartInsIntrv = Convert.ToInt32(null); }

                                if (rdb_Assy.IsChecked == true) { PartAssTyp = 1; }
                                else { PartAssTyp = 2; }

                                if (rdb_Con_SV.IsChecked == true) { partConID = 2; }
                                else if (rdb_Con_US.IsChecked == true) { partConID = 3; }
                                else if (rdb_Con_SC.IsChecked == true) { partConID = 4; }
                                else if (rdb_Con_QA.IsChecked == true) { partConID = 5; }
                                else if (rdb_Con_AR.IsChecked == true) { partConID = 6; }
                                else if (rdb_Con_UN.IsChecked == true) { partConID = 7; }

                                //////////////ذخیره اطلاعات در دیتابیس
                                database.SP_ins_Part(
                                    txt_NameE.Text.Trim(), txt_NameP.Text.Trim(), txt_PN.Text.Trim(), txt_SN.Text.Trim(),
                                    PartAssTyp, cmb_PartType.SelectedIndex + 1, partimage, txt_Register.Text.Trim(),
                                    (byte)(cmb_Unit.SelectedIndex + 1), txt_Manufacturer.Text.Trim(), txt_Size.Text.Trim(),
                                    PartInsIntrv, calender_LID.Text.Trim(), calender_NID.Text.Trim(), cmb_Store.SelectedIndex + 1,
                                    txt_WO.Text.Trim(), txt_Remark.Text.Trim(), PublicVariables.gUserID, 1, 0,
                                    String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_start.Text)),
                                    txt_Position.Text.Trim(), partConID);

                                database.SaveChanges();

                                MessageBox.Show("پارت موردنظر با موفقیت ذخیره گردید.");

                                MessageBoxResult r = MessageBox.Show("آیا مایلید تاریخ آخرین بازرسی این پارت در جدول تاریخچه بازرسی های آن هم به عنوان یک رکورد ذخیره گردد؟", "سوال", MessageBoxButton.YesNo, MessageBoxImage.Question);
                                if (r == MessageBoxResult.Yes)
                                {
                                    var rezult = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                    database.SP_ins_Update_LID(rezult[0].PartID, rezult[0].PartLID, DateTime.Now, null);
                                    database.SaveChanges();
                                }
                                
                                break;
                            }
                        case 2:
                            {
                                ////////////ویرایش پارت
                                if (imgName != null)
                                {
                                    /////////////////دستورات تبدیل تصویر به رشته برای ذخیره در دیتابیس
                                    FileStream fs = new FileStream(imgName, FileMode.Open, FileAccess.Read);
                                    byte[] imgByteArr = new byte[fs.Length];
                                    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
                                    fs.Close();
                                    partimage = imgByteArr;
                                }
                                else
                                {
                                    partimage = null;
                                }
                                //////////////////////////////////چک کردن اینکه آیا این رجیستر پارت از قبل وجود دارد یا خیر
                                var result = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                if (result.Count == 0 || (result.Count > 0 && result[0].PartID == Convert.ToInt32(lbl_PartID.Content)))
                                {
                                    partReg = txt_Register.Text.Trim();
                                }
                                else
                                {
                                    MessageBox.Show("این رجیستر از قبل وجود دارد و تکراری است، لطفا رشته دیگری را وارد کنید.");
                                    txt_Register.Focus();
                                    return;
                                }

                                ////////////////////////////////////////////////////////
                                if (calender_LID.Text != "")
                                { LID = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_LID.Text)); }
                                else { calender_LID.Text = null; }

                                if (calender_NID.Text != "")
                                { NID = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_NID.Text)); }
                                else { calender_NID.Text = null; }

                                SDate = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_start.Text));

                                if (txt_Interval.Text != "") { PartInsIntrv = Convert.ToInt32(txt_Interval.Text.Trim()); }
                                else { PartInsIntrv = Convert.ToInt32(null); }

                                if (rdb_Assy.IsChecked == true)
                                { PartAssTyp = 1; }
                                else { PartAssTyp = 2; }

                                if (rdb_Con_SV.IsChecked == true) { partConID = 2; }
                                else if (rdb_Con_US.IsChecked == true) { partConID = 3; }
                                else if (rdb_Con_SC.IsChecked == true) { partConID = 4; }
                                else if (rdb_Con_QA.IsChecked == true) { partConID = 5; }
                                else if (rdb_Con_AR.IsChecked == true) { partConID = 6; }
                                else if (rdb_Con_UN.IsChecked == true) { partConID = 7; }

                                /////////////////یک پرچم قرار داده ایم تا در صورتی که تغییری در تاریخ آخرین بازرسی رخ داده باشد پیام بعد از بروزرسانی موفق جهت اضافه کردن رکورد به کاربر داده شود
                                if (LID != result[0].PartLID)
                                {
                                    txtchg = true;
                                }
                                ///////////////

                                database.Sp_Update_Part(PartID,
                                    txt_NameE.Text.Trim(), txt_NameP.Text.Trim(), txt_PN.Text.Trim(), txt_SN.Text.Trim(),
                                    PartAssTyp, cmb_PartType.SelectedIndex + 1, partimage, partReg,
                                    (byte)(cmb_Unit.SelectedIndex + 1), txt_Manufacturer.Text.Trim(), txt_Size.Text.Trim(),
                                    PartInsIntrv, LID, NID,
                                    cmb_Store.SelectedIndex + 1, txt_WO.Text.Trim(), txt_Remark.Text.Trim(),
                                    PublicVariables.gUserID, 1, 0,
                                    SDate, txt_Position.Text.Trim(), partConID);
                                database.SaveChanges();
                                MessageBox.Show(" بروزرسانی اطلاعات پارت با موفقیت ثبت شد");

                                if (txtchg == true) ////////////بروزرسانی آخرین تاریخ بازرسی در صورتی انجام شود که با استفاده از پرچم قرار داده شده بالا مشخص شود که تغییری در تاریخ آخرین بازرسی رخ داده است
                                {
                                    MessageBoxResult rr = MessageBox.Show("آیا مایلید تاریخ آخرین بازرسی این پارت در جدول تاریخچه بازرسی های آن هم به عنوان یک رکورد جدید ذخیره گردد؟", "سوال", MessageBoxButton.YesNo, MessageBoxImage.Question);

                                    if (rr == MessageBoxResult.Yes)
                                    {
                                        var rezult = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                        database.SP_ins_Update_LID(rezult[0].PartID, rezult[0].PartLID, DateTime.Now, null);
                                        database.SaveChanges();
                                        txtchg = false;
                                    }
                                }
                                break;
                            }
                    }

                }
                catch
                {
                    MessageBox.Show("در ثبت اطلاعات مشکلی رخ داده است لطفا بررسی نمایید");
                }
                finally
                {

                }
            }

 

به این پاسخ امتیاز بدهید    1
امتیاز: 20 رتبه: 36
پاسخ دهنده : Sowgandi 12:12 1399/02/22

دوست عزیز شما داخل کدهاتون از TransactionScope استفاده کردید و این تابع رو نبستید. یعنی اینکه Complete نکردید به همین دلیل کدهایی که نوشتید در دیتابیس ذخیره نمیشه. برای رفع این مشکل Transaction  رو ببندید و یا اینکه تمام کدهای بالا رو که نوشتید حذف و کدهای پایین رو جای اونها قرار بدید.

این کار رو انجام بدید به احتمال زیاد مشکلتون حل میشه.

  private void btn_ok_Click(object sender, RoutedEventArgs e)
        {
            if (!checkNullable())
            {
                return;
            }
            using (TransactionScope TS = new TransactionScope())
            {
                try
                {
                    switch (win_Type)
                    {
                        case 1:
                            {///////////////InsertBlock
                                if (imgName != null)
                                {
                                    /////////////////دستورات تبدیل تصویر به رشته برای ذخیره در دیتابیس
                                    FileStream fs = new FileStream(imgName, FileMode.Open, FileAccess.Read);
                                    byte[] imgByteArr = new byte[fs.Length];
                                    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
                                    fs.Close();
                                    partimage = imgByteArr;
                                }
                                else
                                {
                                    partimage = null;
                                }
                                //////////////////////////////////چک کردن اینکه آیا این رجیستر پارت از قبل وجود دارد یا خیر
                                var result = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                if (result.Count > 0)
                                {
                                    MessageBox.Show("این رجیستر از قبل وجود دارد و تکراری است، لطفا رشته دیگری را وارد کنید.");
                                    txt_Register.Focus();
                                    return;
                                }
                                /////////////////////////////تعیین شرط محدودیت دسترسی به انبار برای کاربران
                                if (cmb_Store.SelectedIndex + 1 != PublicVariables.gStoreID && PublicVariables.gStoreID != 1)
                                {
                                    MessageBox.Show("به جهت محدودیت دسترسی کاربر، مجاز به تعریف پارت انبار انتخاب شده نمی باشید. لطفا انبار مورد دسترس با نام کاربری خود را وارد نمایید.", "محدودیت دسترسی", MessageBoxButton.OK, MessageBoxImage.Warning);
                                    cmb_Store.Focus();
                                    return;
                                }
                                /////////////////////////////////////////////////////////ثبت پارت جدید

                                if (txt_Interval.Text != "")
                                { PartInsIntrv = Convert.ToInt32(txt_Interval.Text.Trim()); }
                                else { PartInsIntrv = Convert.ToInt32(null); }

                                if (rdb_Assy.IsChecked == true) { PartAssTyp = 1; }
                                else { PartAssTyp = 2; }

                                if (rdb_Con_SV.IsChecked == true) { partConID = 2; }
                                else if (rdb_Con_US.IsChecked == true) { partConID = 3; }
                                else if (rdb_Con_SC.IsChecked == true) { partConID = 4; }
                                else if (rdb_Con_QA.IsChecked == true) { partConID = 5; }
                                else if (rdb_Con_AR.IsChecked == true) { partConID = 6; }
                                else if (rdb_Con_UN.IsChecked == true) { partConID = 7; }

                                //////////////ذخیره اطلاعات در دیتابیس
                                database.SP_ins_Part(
                                    txt_NameE.Text.Trim(), txt_NameP.Text.Trim(), txt_PN.Text.Trim(), txt_SN.Text.Trim(),
                                    PartAssTyp, cmb_PartType.SelectedIndex + 1, partimage, txt_Register.Text.Trim(),
                                    (byte)(cmb_Unit.SelectedIndex + 1), txt_Manufacturer.Text.Trim(), txt_Size.Text.Trim(),
                                    PartInsIntrv, calender_LID.Text.Trim(), calender_NID.Text.Trim(), cmb_Store.SelectedIndex + 1,
                                    txt_WO.Text.Trim(), txt_Remark.Text.Trim(), PublicVariables.gUserID, 1, 0,
                                    String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_start.Text)),
                                    txt_Position.Text.Trim(), partConID);

                                database.SaveChanges();

                                MessageBox.Show("پارت موردنظر با موفقیت ذخیره گردید.");

                                MessageBoxResult r = MessageBox.Show("آیا مایلید تاریخ آخرین بازرسی این پارت در جدول تاریخچه بازرسی های آن هم به عنوان یک رکورد ذخیره گردد؟", "سوال", MessageBoxButton.YesNo, MessageBoxImage.Question);
                                if (r == MessageBoxResult.Yes)
                                {
                                    var rezult = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                    database.SP_ins_Update_LID(rezult[0].PartID, rezult[0].PartLID, DateTime.Now, null);
                                    database.SaveChanges();
                                }

                                break;
                            }
                        case 2:
                            {
                                ////////////ویرایش پارت
                                if (imgName != null)
                                {
                                    /////////////////دستورات تبدیل تصویر به رشته برای ذخیره در دیتابیس
                                    FileStream fs = new FileStream(imgName, FileMode.Open, FileAccess.Read);
                                    byte[] imgByteArr = new byte[fs.Length];
                                    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
                                    fs.Close();
                                    partimage = imgByteArr;
                                }
                                else
                                {
                                    partimage = null;
                                }
                                //////////////////////////////////چک کردن اینکه آیا این رجیستر پارت از قبل وجود دارد یا خیر
                                var result = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                if (result.Count == 0 || (result.Count > 0 && result[0].PartID == Convert.ToInt32(lbl_PartID.Content)))
                                {
                                    partReg = txt_Register.Text.Trim();
                                }
                                else
                                {
                                    MessageBox.Show("این رجیستر از قبل وجود دارد و تکراری است، لطفا رشته دیگری را وارد کنید.");
                                    txt_Register.Focus();
                                    return;
                                }

                                ////////////////////////////////////////////////////////
                                if (calender_LID.Text != "")
                                { LID = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_LID.Text)); }
                                else { calender_LID.Text = null; }

                                if (calender_NID.Text != "")
                                { NID = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_NID.Text)); }
                                else { calender_NID.Text = null; }

                                SDate = String.Format("{0:yyyy/MM/dd}", Convert.ToDateTime(calender_start.Text));

                                if (txt_Interval.Text != "") { PartInsIntrv = Convert.ToInt32(txt_Interval.Text.Trim()); }
                                else { PartInsIntrv = Convert.ToInt32(null); }

                                if (rdb_Assy.IsChecked == true)
                                { PartAssTyp = 1; }
                                else { PartAssTyp = 2; }

                                if (rdb_Con_SV.IsChecked == true) { partConID = 2; }
                                else if (rdb_Con_US.IsChecked == true) { partConID = 3; }
                                else if (rdb_Con_SC.IsChecked == true) { partConID = 4; }
                                else if (rdb_Con_QA.IsChecked == true) { partConID = 5; }
                                else if (rdb_Con_AR.IsChecked == true) { partConID = 6; }
                                else if (rdb_Con_UN.IsChecked == true) { partConID = 7; }

                                /////////////////یک پرچم قرار داده ایم تا در صورتی که تغییری در تاریخ آخرین بازرسی رخ داده باشد پیام بعد از بروزرسانی موفق جهت اضافه کردن رکورد به کاربر داده شود
                                if (LID != result[0].PartLID)
                                {
                                    txtchg = true;
                                }
                                ///////////////

                                database.Sp_Update_Part(PartID,
                                    txt_NameE.Text.Trim(), txt_NameP.Text.Trim(), txt_PN.Text.Trim(), txt_SN.Text.Trim(),
                                    PartAssTyp, cmb_PartType.SelectedIndex + 1, partimage, partReg,
                                    (byte)(cmb_Unit.SelectedIndex + 1), txt_Manufacturer.Text.Trim(), txt_Size.Text.Trim(),
                                    PartInsIntrv, LID, NID,
                                    cmb_Store.SelectedIndex + 1, txt_WO.Text.Trim(), txt_Remark.Text.Trim(),
                                    PublicVariables.gUserID, 1, 0,
                                    SDate, txt_Position.Text.Trim(), partConID);
                                database.SaveChanges();
                                MessageBox.Show(" بروزرسانی اطلاعات پارت با موفقیت ثبت شد");

                                if (txtchg == true) ////////////بروزرسانی آخرین تاریخ بازرسی در صورتی انجام شود که با استفاده از پرچم قرار داده شده بالا مشخص شود که تغییری در تاریخ آخرین بازرسی رخ داده است
                                {
                                    MessageBoxResult rr = MessageBox.Show("آیا مایلید تاریخ آخرین بازرسی این پارت در جدول تاریخچه بازرسی های آن هم به عنوان یک رکورد جدید ذخیره گردد؟", "سوال", MessageBoxButton.YesNo, MessageBoxImage.Question);

                                    if (rr == MessageBoxResult.Yes)
                                    {
                                        var rezult = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

                                        database.SP_ins_Update_LID(rezult[0].PartID, rezult[0].PartLID, DateTime.Now, null);
                                        database.SaveChanges();
                                        txtchg = false;
                                    }
                                }
                                break;
                            }
                    }

                }
                catch
                {
                    MessageBox.Show("در ثبت اطلاعات مشکلی رخ داده است لطفا بررسی نمایید");
                }
                finally
                {

                }

                TS.Complete();
            }
            }

 

ویرایش شده در دوشنبه 22 اردیبهشت 1399 ساعت 12:15:02
به این پاسخ امتیاز بدهید    3
امتیاز: 871 رتبه: 3
پاسخ دهنده : Mfarahmand 09:49 1399/02/23

سپاس فراوان دوست عزیز، در این مورد مشکل حل شد،
اما مشکل دیگری که درحال حاضر با اون مواجه هستم اینه که بعد از Transaction Scope با فراخانی متد های پر کردن تکست باکس های پنجره، از همون داده های قبلی استفاده میشه و برای نمایش داده های تغییر یافته باید پنجره بسته و دوباره باز بشه تا داده های تغییر یافته نمایش داده بشه...
(ادامه کد بالا متد های فراخانی و پر نمودن تکست باکس ها رو قرار دادم، درسته؟؟)

            TS.Complete();
            }

            /////////////بدست آوردن ای دی پارت مرتبط با رجیستر وارد شده در تکس باکس
            var rst = database.Sp_FindDataPart_By_Register(txt_Register.Text.Trim()).ToList();

            if (rst.Count > 0)
            {
                ///////////////////نمایش اطلاعات پارت
                ShowDataPart(rst[0].PartID);
                ////////
                ShowImage(rst[0].PartID);

            }


           }

 

ویرایش شده در سه شنبه 23 اردیبهشت 1399 ساعت 09:55:37
به این پاسخ امتیاز بدهید    0
امتیاز: 20 رتبه: 36
پاسخ دهنده : Sowgandi 11:22 1399/02/23

بله کدهاتون درست هستش.

ولی احتمالا مشکل شما بخاطر اینه که شیء  database  رو در بدنه فرم تعریف کردید. به همین خاطر چون اطلاعات از قبل در این شیء ذخیره شده تکست باکس ها از همون اطلاعات قبلی فراخوانی میشه. برای رفع این مشکل شیء database رو داخل متد کلیک باتن قرار بدید. همون قبل از شروع Transaction تعریفش کن. با این کار هر با که این متد اجرا بشه شیء تازه از دیتابیس تعریف میشه و مشکلتون احتمالا حل میشه.

 

ویرایش شده در سه شنبه 23 اردیبهشت 1399 ساعت 11:25:57
به این پاسخ امتیاز بدهید    1
امتیاز: 871 رتبه: 3
پاسخ دهنده : Mfarahmand 12:32 1399/02/23

بسیار لطف کردید ، البته علاوه بر ایجاد یک شیء جدید از دیتابیس قبل از transaction یک شیء دیگر هم داخل متد های فراخانی داده ها قرار دادم تا مشکل حل شد.

ممنون از وقتی که گذاشتید و خدا خیرتون بده...

 

به این پاسخ امتیاز بدهید    2
امتیاز: 20 رتبه: 36
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود