PDA

View Full Version : کمک برای اعمال تغییر در پایگاه داده



mhf61mhf61
یک شنبه 25 فروردین 1387, 01:07 صبح
سلام عزیزان

من با یک پایگاه داده Access کار می کنم. چند تا مشکل دارم::افسرده:

1-در ابتدای load فرمی که اطلاعات را برای ذخیره در بانک داده میگیرد , بعد از binding داده ها به Textbox ها فرم نشان داده شده پر می باشد. چگونه باید آنرا خالی کرد؟(clear کردن textbox ها فایده ندارد.)

2-در همین فرم و هنگامی که داده ها وارد می شود باید اگر داده ای تکراری بود برنامه اطلاع دهد اما اجازه save هم دهد، چه راه حلی دارید؟

3- در همین فرم غیر از Save داده ها نیاز دارم که در حالتی خاص ستونی از برخی از داده های قبلی را دستکاری کنم . این کار به درستی انجام می شود و dataset تغییر می کند اما با فرمان update در پایگاه داده save نمی شود. در حالتی که زیربرنامه این قسمت غبر فعال است save داده های جدید به درستی انجام می شود ولی تغییرات در پایگاه داده save نمی شود. اما هنگامی که این زیر برنامه فعال می شود دیگر نه داده جدید save می شود و نه تغییرات. (با اینکه در dataset داده های جدید و تمام تغییرات به درستی اعمال می شود اما در پایگاه داده save نمی شود) چه کنم؟؟؟؟؟؟:گریه::عصبانی++:
:عصبانی:

ممنون از لطف شما

sahmah65
یک شنبه 25 فروردین 1387, 07:23 صبح
سلام عزیزان

من با یک پایگاه داده Access کار می کنم. چند تا مشکل دارم::افسرده:

1-در ابتدای load فرمی که اطلاعات را برای ذخیره در بانک داده میگیرد , بعد از binding داده ها به Textbox ها فرم نشان داده شده پر می باشد. چگونه باید آنرا خالی کرد؟(clear کردن textbox ها فایده ندارد.)

2-در همین فرم و هنگامی که داده ها وارد می شود باید اگر داده ای تکراری بود برنامه اطلاع دهد اما اجازه save هم دهد، چه راه حلی دارید؟


1-باید DataBindingمربوط به TxtBoxها Clear بشه.
2-اگر داده ی تکراری پیدا شد با استفده ازیه messageBoxیه ِDialogResult ایجاد کن اگه کاربر Yes رو زد Save و اگر No رو زدcancel

gdevnb
یک شنبه 25 فروردین 1387, 07:59 صبح
3- در همین فرم غیر از Save داده ها نیاز دارم که در حالتی خاص ستونی از برخی از داده های قبلی را دستکاری کنم . این کار به درستی انجام می شود و dataset تغییر می کند اما با فرمان update در پایگاه داده save نمی شود. در حالتی که زیربرنامه این قسمت غبر فعال است save داده های جدید به درستی انجام می شود ولی تغییرات در پایگاه داده save نمی شود. اما هنگامی که این زیر برنامه فعال می شود دیگر نه داده جدید save می شود و نه تغییرات. (با اینکه در dataset داده های جدید و تمام تغییرات به درستی اعمال می شود اما در پایگاه داده save نمی شود) چه کنم؟
این قسمت از کد رو بزارید.

mhf61mhf61
یک شنبه 25 فروردین 1387, 11:13 صبح
سلام و ممنون از وقتی که می گذارید.

کد زیر، زیربرنامه یافتن مشترکها است.(همان که در سوال دوم پرسیده بودم, با الگوریتمی که به ذهنم رسید.) در این زیر برنامه من با استفاده از datatable و datarow یک ستون را تغییر می دهم. سپس datarow و datatable و dataset را Acceptchange() کرده ام . از اینجا تا آخر برنامه هر جا که dataset را نگاه کرده ام به درستی تغییرات لازم در آن داده شده است. اما در پایگاه داده save نمی شود. (قسمت تغییر ستون و dataset را قرمز کرده ام. بقیه زیربرنامه را چون ناقص است؛ کاری نداریم). بعد از این زیربرنامه کدهای به رنگ سبز به اجرا در می آید. اینها همان کدی است که بعد از باز کردن database و پرکردن dataset و binding داده ها در زیربرنامه های جدا؛ برای Save داده جدید به کار می رفته و تا قبل از اجرای این زیربرنامه به درستی کار می کرده است.و اگر این زیر برنامه غیر فعال شود عمل save داده جدید به درستی انجام می شود.





privatevoid findcommon()
{
DataTable MyDataTable=dataset.Tables["Table1"];
DataRow[] MyDataRow1=MyDataTable.Select("ID=3956");
if (MyDataRow1!=null)
{
DataRow[] MyDataRow2=MyDataTable.Select("LastName='ë¥یی'");
if (MyDataRow2 != null)
{
DataRow[] MyDataRow3 = MyDataTable.Select("PasportNumber=12334");
if (MyDataRow3 != null)
{
int i;
int rownum = MyDataRow3.Count();
label16.Text = Convert.ToString(rownum);
for (i = 0; i < rownum; i++)
{
DataRowState datarowstate3=MyDataRow3[i].RowState;
MyDataRow3[i].BeginEdit();
MyDataRow3[i].SetField("Common", "NPI");

MyDataRow3[i].EndEdit();
MyDataRow3[i].AcceptChanges();

MyDataTable.AcceptChanges();

dataset.AcceptChanges();

}
}
}
}
}

--------------------------------------------------

oledbcommandbuilder1=newOleDbCommandBuilder(oledbd ataadapter1);
oledbdataadapter1=oledbcommandbuilder1.DataAdapter ;
oledbdataadapter1.Update(dataset,"Table1");
oledbconnection1.Close();
--------------------------------------------------------

mhf61mhf61
یک شنبه 25 فروردین 1387, 11:27 صبح
دوست عزیزم Sahmah65

از راهنمایی ساده و مفید اول شما ممنونم. مشکلم را حل کرد.
در مورد راهنمایی دوم حرف شما کاملا درست بود و من هم همین راه را در پیش گرفتم اما منظور من دستور و یا الگوریتم رایجی در Sql و یا C# برای یافتن مشابه ها در بانک داده بود. ( که البته همان طور که در پست قبلی گفته ام اکنون از الگوریتمی خودساخته استفاده می کنم.)

با تشکر از تو دوست خوبم ، منتظر راهنمایی شما و همچنین gdevnb و دیگران برای مورد باقیمانده هستم.

sahmah65
یک شنبه 25 فروردین 1387, 20:25 عصر
دوست عزیزم Sahmah65

در مورد راهنمایی دوم حرف شما کاملا درست بود و من هم همین راه را در پیش گرفتم اما منظور من دستور و یا الگوریتم رایجی در Sql و یا C# برای یافتن مشابه ها در بانک داده بود. ( که البته همان طور که در پست قبلی گفته ام اکنون از الگوریتمی خودساخته استفاده می کنم.)



اگه بخای در جدول رکورد تکراری درج بشه در اینصورت جدول نباید کلید اصلی داشته باشه
وسوالی که برای من پیش اومده اینه که اصلا چرا می خای رکود تکراری درج کنی؟ می دونی وقتی تعداد داده ها زیاد بشه چی پیش میاد؟ و مدیریت Data چقدر سخت میشه؟از این کار جز در موارد ضروری باید دوری کرد.
اما برای اینکه بفهمی توی جدول رکورد مورد نظر وجود داره یا نه به هر حال این اطلاعات از یه جایی گرفته می شه((معمولاًTextBox)) می تونی این اطلاعات رو بسته به نوعشون در متغیر هایی نگهداری کنی و وقتی که دکمه Save زده میشه اول یه دستور SQL اجرا کنی به مضمون زیر

Select Count(*)From TableName Where Col1=@Col1 and col2=@col2

که بایدCol@ها رو با مقادیر متغیر ها مقدار دهی کنی حالا اگه این دستور 0 برگردوند که داده تو بانک نیست اگه غیر صفر بود که ...
البته من Accessکار نکردم وبه تو دوست عزیز هم توصیه می کنم که که اگه میخای برنامه نویسی رو جدی دنبال کنی از همین الان بزارش کنار و بهش عادت نکن چون در اکثر مواقع شما وقتی که بانکت Access هست و در حین کار برنامه اگه سیستم دچار یه نقص منجر به Reset شدن بشه بخشی ازاطلاعات بانک تخریب میشه از این دست موارد بسیار رخ داده. حالا بحث سرعت و سایر موارد بماند...

mhf61mhf61
سه شنبه 27 فروردین 1387, 16:10 عصر
بچه ها سلام

کسی پاسخ من را نداد. :افسرده:من تمام کارهای لازم برای update پایگاه داده را انجام می دهم. dataset هم تغییر می کند، update هم هیچ پیغام خطایی تولید نمی کند اما تغییر در پایگاه داده اعمال نمی شود. :گریه:
اگر میشه لطفا کمک کنید.:عصبانی++:

این هم کد این قسمت از برنامه ام:


strSqlquery2 = "Select * From Table1";
oledbdataadapter2 = newOleDbDataAdapter(strSqlquery2, oledbconnection1);
oledbdataadapter2.Fill(dataset2, "Table1");
DataTable MyDataTable = dataset2.Tables["Table1"];
MyDataTable.PrimaryKey = newDataColumn[]
{
MyDataTable.Columns["UNCCReference"]
};
DataRow[] MyDataRow1 = MyDataTable.Select("ID=8787");
if (MyDataRow1 != null)
{
int i;
int rownum = MyDataRow1.Count();
for (i = 0; i < rownum; i++)
{
MyDataRow1[i]["Common"] = "NPI";
/*MyDataRow1[i].BeginEdit();
MyDataRow1[i].SetField("Common", "NPI");
MyDataRow1[i].EndEdit();*/

dataset2.AcceptChanges();
oledbcommandbuilder2 = newOleDbCommandBuilder(oledbdataadapter2);
oledbdataadapter2 = oledbcommandbuilder2.DataAdapter;
oledbdataadapter2.Update(dataset2, "Table1");

}
}

hassan razavi
سه شنبه 27 فروردین 1387, 16:20 عصر
برای احتیاط بجای


oledbdataadapter2 = oledbcommandbuilder2.DataAdapter;

بنویس


oledbdataadapter2.UpdateCommand = oledbcommandbuilder2.GetUpdateCommand();

و بعد مقدار UpdateCommand.CommandText رو کنترل کنید.

mhf61mhf61
سه شنبه 27 فروردین 1387, 16:33 عصر
سلام

با تشکر از Hassan Razavi عزیز که به سرعت به کمک آمد.:تشویق:

مشکل آنجا نبود. همین الان از یک سایت انگلیسی راه حل مشکل را پیدا کردم. اگر در کد نگاه کنید قبل از فرمان upadate من از MyDataTable.AcceptChanges() استفاده کرده ام. :متعجب:مشکل همین جاست که وجود این فرمان باعث نادیده گرفتن تغییرات توسط update می شود.(که البته نمی دانم چرا و به دلیل عجله فعلا فرصت فکر کردن به دلیلش را ندارم). اما به هر حال مشکلم حل شد.:قهقهه:
لینک سایت:
http://www.dotnet247.com/247reference/msgs/49/246866.aspx