سلام، برنامه بنده انبارداری و فروش تحت شبکه می خواد باشه که توی تنظیمات رشته اتصال به صورت داینامیک به مشکل خوردم ، در حال حاضر برنامه هیچ گونه خطایی نمیده و با ران گرفتن داده ها از دیتابیس هم خوانده میشه اما وقتی که اونهارو توی برنامه تغییر میدم ، تغییرات در دیتابیس انجام نمیشه، این کار قبلا انجام می شد اما الان نمیدونم چرا؟؟ توی اینترنت هم خیلی سرچ کردم (Entity Framework doesn't save new record into database)
دستورات کد اتصال:
public static string BuildEntityConnection(string ADOconnectionstring)
{
var entityConnection = new EntityConnectionStringBuilder
{
Provider = "System.Data.SqlClient",
ProviderConnectionString = ADOconnectionstring,
Metadata = "res://*"
};
return entityConnection.ToString();
}
private void btn_ok_Click(object sender, RoutedEventArgs e)
{
var entityConnectionString = BuildEntityConnection("Data Source=" + txt_serverip.Text.Trim() + "; Initial Catalog=" + txt_dbname.Text.Trim()
+ "; user Id=sa;Password=" + txt_password.Password + ";Integrated Security=false");
try
{
RegistryKey connectionKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TEMAR");
try
{
connectionKey.SetValue("CreateConnection", CryptionAlgorithm.EncryptTextUsingUTF8(entityConnectionString));
}
catch
{
MessageBox.Show("در ارتباط با سرور اشکالی بوجود آمده است");
}
finally
{
connectionKey.Close();
}
MessageBox.Show("ارتباط با سرور برقرار شد");
this.Close();
}
catch
{
MessageBox.Show("در ارتباط با سرور اشکالی بوجود آمده است");
}
finally
{
}
}
آخه قبلا این کدها مشکلی نداشتند و تغییرات انجام می شد
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
{
}
}
دوست عزیز شما داخل کدهاتون از 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();
}
}
سپاس فراوان دوست عزیز، در این مورد مشکل حل شد،
اما مشکل دیگری که درحال حاضر با اون مواجه هستم اینه که بعد از 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);
}
}
بله کدهاتون درست هستش.
ولی احتمالا مشکل شما بخاطر اینه که شیء database رو در بدنه فرم تعریف کردید. به همین خاطر چون اطلاعات از قبل در این شیء ذخیره شده تکست باکس ها از همون اطلاعات قبلی فراخوانی میشه. برای رفع این مشکل شیء database رو داخل متد کلیک باتن قرار بدید. همون قبل از شروع Transaction تعریفش کن. با این کار هر با که این متد اجرا بشه شیء تازه از دیتابیس تعریف میشه و مشکلتون احتمالا حل میشه.
بسیار لطف کردید ، البته علاوه بر ایجاد یک شیء جدید از دیتابیس قبل از transaction یک شیء دیگر هم داخل متد های فراخانی داده ها قرار دادم تا مشکل حل شد.
ممنون از وقتی که گذاشتید و خدا خیرتون بده...
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
346
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
309
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4263
- پاسخ :
1
|
تاریخ :
1398/09/16
- ساعت :
11:41:00 AM
- بازدید :
4279
- پاسخ :
1
|
تاریخ :
1398/09/07
- ساعت :
02:15:00 PM
- بازدید :
3874
- پاسخ :
5
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
654
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3170
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3250
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
55
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
93
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1031
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
426
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
930
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1347
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4796
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1157
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
595
- پاسخ :
1
|
تاریخ :
1403/07/27
- ساعت :
03:21:00 PM
- بازدید :
205
- پاسخ :
1
|