PDA

View Full Version : بروز رسانی DataBase توسط DataAdapter



Milad.PJ
دوشنبه 19 آبان 1393, 18:22 عصر
سلام
من می خوام در یک محیط غیر متصل چند تا رکورد (ROW) به جدولم اضافه کنم و بعد هر وقت خواستم با یک دکه منبع اصلی رو با داده های جدید به روز رسانی کنم ، زمانی که تک به تک به روز رسانی می کنم مشکلی ایجاد نمی شه اما اگر بیشتر از یک رکورد رو بخوام در یک زمان اضافه کنم فقط رکورد آخر در DB اضافه می شه و بعد DataAdapter خطا می ده ( چون دوباره می خواد رکورد آخر رو اضافه کنه و به خاطر فیلد کلید نمی شه ) ! چرا از آخر اضافه می کنه و قبلیهاش رو کلا اضافه نمی کنه ؟؟؟ :متفکر:

این هم کد من :

کد درج:


private void btnInsert_Click(object sender, EventArgs e)
{
dtTESTDB = dsTESTDB.Tables["dstblTESTDB"];
drTblTESTDB = dtTESTDB.NewRow();
drTblTESTDB.BeginEdit();
drTblTESTDB["ID"] = txtID.Text;
drTblTESTDB["Name"] = txtName.Text;
drTblTESTDB["Family"] = txtFamily.Text;
dtTESTDB.Rows.Add(drTblTESTDB);
dtlAdd= dsTESTDB.Tables[0].GetChanges(DataRowState.Added);
drTblTESTDB.EndEdit();
cmd.Parameters.AddWithValue("@ID", int.Parse(txtID.Text));
cmd.Parameters.AddWithValue("@Name", txtName.Text);
cmd.Parameters.AddWithValue("@Family", txtFamily.Text);
cmd.CommandType = CommandType.Text;
cmd.Connection = SQLConnection;
cmd.CommandText = "insert into tblTESTDB
(ID,Name,Family) values (@ID,@Name,@Family)";
cmd.UpdatedRowSource = UpdateRowSource.None;
da.InsertCommand = cmd;
}

کد به روز رسانی (همسان سازی):

private void btnSynchronize_Click(object sender, EventArgs e)
{
try
{
da.UpdateBatchSize = 0;// dttblAdd.Rows.Count;
da.Update(dtlAdd);
dsTESTDB.AcceptChanges();
}
catch (SqlException sqlEX)
{
MessageBox.Show(sqlEX.ToString());
}
catch (System.Exception EX)
{
MessageBox.Show(EX.ToString());
}
}

ممنون می شم اگر راهنماییم کنید !

Milad.PJ
دوشنبه 26 آبان 1393, 00:06 صبح
ظاهرا موضوع قدری پیچیده شده ! هیچکس نظری نداره ؟ مگه می شه راه حل نداشته باشه ! تو Stackoverflow هم مطرح کردم ولی خبری نشد !!! شاید از تاریخ 15 آبان !!!

زمانی که مثلا 2تا رکورد تو یکی از جداول DataSet اضافه می کنم و می خوام در یک زمان هر دو رو به بانک منتقل کنم ، موقع Trace برنامه مشخص می شه DataAdapter برای بار اول که اجرا می شه آخرین رکورد رو به DataBase اضافه می کنه (و حتی جدول ارجاع داده شده به DataAdapter هم دارای همین دو رکورد جدید هست که هنوز وضعیت "Added" دارند) ولی دوباره سعی داره تا باز رکورد آخر رو اضافه کنه که موجب می شه به خاطر اینکه فیلد کلید هست ، از تکرا اضافه کردن اون جلوگیری بشه . یعنی خود DataAdapter بر میگرده تا مابقی رکورد ها رو اضافه کنه ولی چرا باز آخری ؟؟؟
در ضمن همین طور که گقتم اگر یکی یکی اضافه کنم و آپدیت کنم مشکلی پیش نمیاد ! این در حالیه که تو خود منابع مایکروسافت حرف از آپدیت چند جدول داخل DataSet ارسالی به متد Update شی DataAdapter به طور همزمان اومده !!!

Milad.PJ
سه شنبه 27 آبان 1393, 11:30 صبح
هی وای من ! راه حل نخواستیم ! ایراد کار رو هم بدون راه حل می پذیریم !
لطفا هر چیز درست یا غلطی به ذهنتون می رسه بگید !!!

این 100% شدنیه چون تو خود مبع مایکروسافت گفته شده ولی چرا هیچ کس راه حلی براش پیدا نمی کنه ؟

باورتون می شه کل برنامه گیر همینه ؟؟؟

:متفکر: :گریه:

alisafaie
سه شنبه 27 آبان 1393, 13:23 عصر
روی روش آپدیت دیتابیس تون هم من به روش شما کار نکردم و نمی دونم ولی فیلد کلید اصلی رو از این حالت یک بار خارج کنید. ببینید بازهم مشکل دارید یا خیر.

قابلیت MARS رو روی SQL Server فعال کنید. این قابلیت باعث میشه که بتونید همزمان چندین دستور رو با یکبار session زدن انجام بدید. اگر بازهم مشکل داشتید همین جا اعلام کنید تا بررسی بشه.

Milad.PJ
سه شنبه 27 آبان 1393, 21:34 عصر
روی روش آپدیت دیتابیس تون هم من به روش شما کار نکردم و نمی دونم ولی فیلد کلید اصلی رو از این حالت یک بار خارج کنید. ببینید بازهم مشکل دارید یا خیر.

قابلیت MARS رو روی SQL Server فعال کنید. این قابلیت باعث میشه که بتونید همزمان چندین دستور رو با یکبار session زدن انجام بدید. اگر بازهم مشکل داشتید همین جا اعلام کنید تا بررسی بشه.

با تشکر

قبلا انجام و تست شده ولی بی نتیجه بوده ! فیلد کلید رو از حالت کلید خارج کردم ، به تعداد رکوردی که داخل جدول ارسالی به DataAdapter بوده همون رکورد آخر رو اضافه می کرده ! مثلا اگر جدول 3تا رکورد داشته باشه ، رکورد آخر رو 3بار اضافه می کنه !!!
در مورد MARS اطلاعی ندارم و تست نکردم اگه می شه بیشتر توضیح بدید ! البته سر فرصت حتما خودم بررسیش می کنم !

بازم ممنون

alisafaie
چهارشنبه 28 آبان 1393, 12:26 عصر
برای اطلاعات بیشتر در مورد MARS به لینک زیر مراجعه کنید

فعال‌سازی Multiple Active Result Sets (http://www.dotnettips.info/post/1892/%D9%81%D8%B9%D8%A7%D9%84%E2%80%8C%D8%B3%D8%A7%D8%B 2%DB%8C-multiple-active-result-sets)

Milad.PJ
جمعه 30 آبان 1393, 18:04 عصر
سلام
MARS هم تست شد ! اما حل نشد ! همینطور که گفتم دقیقا اشکال از کد برنامه است !