PDA

View Full Version : مبتدی: بروز رسانی فقط تغییرات اعمال شده در dataset



ali190
سه شنبه 09 فروردین 1390, 13:41 عصر
سلام
یه سئوال در مورد بروز رسانی تغییرات در dataset و نمایش آخرین بروز رسانی رکوردها در datagridview داشتم
من رکوردهامو با dataadapter میریزم تو dataset و به روش زیر اطلاعاتم رو به دیتابیس اضافه میکنم :

Dim con As OleDbConnection = New OleDbConnection("provider=microsoft.jet.oledb.4.0;data source=bank.mdb;")
Dim command As OleDbCommand = New OleDbCommand
command.Connection = con
command.CommandText = "INSERT INTO table1 (nam, famil, tahsilat, sokoonat, ghad,pedar,nomre) VALUES(@nam, @famil, @tahsilat, @sokoonat, @had,@pedar,@nomre);"
command.Parameters.AddWithValue("@nam", Trim(TextBox1.Text))
command.Parameters.AddWithValue("@famil", Trim(TextBox2.Text))
command.Parameters.AddWithValue("@tahsilat", Trim(ComboBox1.Text))
command.Parameters.AddWithValue("@sokoonat", Trim(TextBox4.Text))
command.Parameters.AddWithValue("@ghad", Trim(TextBox3.Text))
command.Parameters.AddWithValue("@pedar", Trim(TextBox3.Text))
command.Parameters.AddWithValue("@nomre", Trim(TextBox6.Text))
con.Open()
command.ExecuteNonQuery()
con.Close()
loaddata()

همانطور که مشاهده میکنید در آخر sub یک تابع به اسم loaddata اومده :

Sub loaddata()
Dim ad As New OleDbDataAdapter("Select * from Table1", cnnstring)
Dim dt As New DataTable
ad.Fill(dt)
grdAuthorTitles.DataSource = dt
End Sub

استفاده از این تابع به این معنی هست که در یک تغییر جزئی رکورد یا افزایش و یا کاهش تعداد رکوردها dataset باید یک بار خالی و مجدداً از ابتدا با اطلاعات رکورد ها پر شود (چه اونهایی که تغییر داشته و چه اونهایی که تغییری ندارند)
من شنیده بودم که dataadapter متدهایی برای این منظور داره ((select,insert,delete,edit(update) که بااین متدها 4 عمل اصلی رو میشه در دیتابیس انجام داد و بروز رسانی رو فقط بر روی رکوردهایی که در اونها تغییرات انجام شده اعمال نمود
در پروژه ای که ضمیمه کردم هر 4 عمل اصلی وجود داره ، میخواستم ازتون خواهش کنم که کمکم کندی این 4 عمل اصلی رو با dataadapter اعمال کنم و فقط تغییرات انجام گرفته رو با متد update در dataset بروز رسانی کنم
یه سئوال دیگه هم از خدمتتون داشتم
مزایا و معایب هر کدوم از این روشها نسبت به هم چیه؟(استفاده از dataadpter و sqlcommand)
ممنون و متشکراز لطف شما
یاعلی

grobech
سه شنبه 09 فروردین 1390, 16:41 عصر
این لینک رو ببین کمکت میکنه یه جستو جو هم کن حتما
http://barnamenevis.org/showthread.php?268430-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-update-%D8%AF%D8%B1-adapter&highlight=

ali190
سه شنبه 09 فروردین 1390, 17:42 عصر
سلام
متاسفانه لینکی که معرفی کردید نتونست کمکی به من کنه
چطور میتونم از متدهای dataadapter در 3 عمل اصلی (update,insert,delete) استفاده کنم و همزمان فقط تغییرات بروز شده رو در dataset و بتبع اون در دیتاگرید ثبت کنم؟
متدهای انجام اعمال 4 گانه در dataadpter و sqlcommand چه فرقی با هم میکنند(استفاده از کدوم روش اصولی تر هست؟)
ممنون میشم کدهاش رو در اختیارم قرار بدید
ممنون و متشکر
یاعلی

ali190
چهارشنبه 10 فروردین 1390, 12:39 عصر
سلام
دوستان اگر میشه بنده رو راهنمایی کنید
ممنون میشم ازتون

محسن شامحمدی
پنج شنبه 11 فروردین 1390, 10:48 صبح
سلام علی جان
همه کدهاتون درسته
فقط کافیه در جدولتون یک فیلد Primary Key داشت باشین.بعد درست می شه!!!

ali190
پنج شنبه 11 فروردین 1390, 11:25 صبح
سلام آقا محسن
ممنون از پاسختون
آقا محسن من در این پروژه مشکل خاصی با کدها ندارم ، بلکه مشکل اصلی من سر انتخاب روش هست
در این روشی که در این تایپیک مطرح کردم برای نمایش تغییرات در دیتاگرید مجبورم datatable ام رو یکبار پر و خالی کنم
حال آنکه من شندیم dataadapter خودش دارای متد update هست و فقط رکوردهایی رو که در دیتابیس با datatable منافات دارند رو در datatable بروز رسانی میکنه
همچنین dataadapter متد Insert ، Delete و Update داره (اگر میشه کدهاش رو برام بذارید)
میخواستم بدونم چطور میتونم در سه عمل اصلی که قراره بر روی رکوردهام انجام بدم از روش dataadapter استفاده کنم؟
در آخر هم میخواستم بدونم استفاده از کدوم روش بهتره؟:
استفاده از dataadapter که خودش تمام متدهای کار با رکورد (4 عمل اصلی افزودن ، ویرایش ، حذف و انتخاب رکوردها) رو داره و آخر سر هم میتونه با استفاده از دستور update رکوردهای تغییر یافته در دیتابیس رو در datatable بروز رسانی کنه یا استفاده از sqlcommand که برای بروز رسانی رکوردها در datatable مجبوریم datatable مون رو یک بار پر و خالی کنیم؟
ممنون میشم راهنماییم کنید
یاعلی

محسن شامحمدی
پنج شنبه 11 فروردین 1390, 12:19 عصر
آقا محسن من در این پروژه مشکل خاصی با کدها ندارم ، بلکه مشکل اصلی من سر انتخاب روش هست
در این روشی که در این تایپیک مطرح کردم برای نمایش تغییرات در دیتاگرید مجبورم datatable ام رو یکبار پر و خالی کنم
حال آنکه من شندیم dataadapter خودش دارای متد update هست و فقط رکوردهایی رو که در دیتابیس با datatable منافات دارند رو در datatable بروز رسانی میکنه
همچنین dataadapter متد Insert ، Delete و Update داره (اگر میشه کدهاش رو برام بذارید)
میخواستم بدونم چطور میتونم در سه عمل اصلی که قراره بر روی رکوردهام انجام بدم از روش dataadapter استفاده کنم؟
در آخر هم میخواستم بدونم استفاده از کدوم روش بهتره؟:
خب معلومه. روش استفاده از DataAdapter و استفاده از متد Update آن



استفاده از dataadapter که خودش تمام متدهای کار با رکورد (4 عمل اصلی افزودن ، ویرایش ، حذف و انتخاب رکوردها) رو داره و آخر سر هم میتونه با استفاده از دستور update رکوردهای تغییر یافته در دیتابیس رو در datatable بروز رسانی کنه
استفاده از این روش اصولیه.
شما تمامی اطلاعات رو توی دیتاگرید نشون می دی
کاربر هر کاری دوست داره با داده ها می کنه(ویرایش،افزودن و حذف)
بعد شما با استفاده از متد update شی DataAdapter میای تمامی تغییرات اعمال شده در Dataset رو به دیتابیست منعکس می کنی.

ali190
پنج شنبه 11 فروردین 1390, 13:00 عصر
سلام
ممنون از توضیحات کاملت
من در نمونه ای که گذاشتم از sqlcommand برای انجام 3 عمل اصلیم انجام دادم
میشه کمکم کنید این کدها رو با استفاده از dataadapter انجام بدم
ممنون میشم از شما
یاعلی

محسن شامحمدی
پنج شنبه 11 فروردین 1390, 13:26 عصر
بفرما اینم برنامه ای که از DataAdapter برای اعمال تغییرات به دیتابیس استفاده می کنه

ali190
پنج شنبه 11 فروردین 1390, 14:06 عصر
سلام
ممنون از لطفت
محسن جان کدی که پشت دکمه "ثبت تغییرات" گذاشتی درست عمل نمیکنه ، فقط تعداد رکوردهامو دو برابر میکنه!؟
آیا من با همین dataadapter میتونم insert و delete رو هم انجام بدم؟
اون کدش چطوره؟
یه ابهام دیگه هم داشتم:

شما تمامی اطلاعات رو توی دیتاگرید نشون می دی
کاربر هر کاری دوست داره با داده ها می کنه(ویرایش،افزودن و حذف)
بعد شما با استفاده از متد update شی DataAdapter میای تمامی تغییرات اعمال شده در Dataset رو به دیتابیست منعکس می کنی.
من با sqlcommand تو datatableام تغییرات رو انجام میدم و آخر سر dataadapter اون تغییرات رو در دیتابیس ذخیره میکنه؟

alimanam
پنج شنبه 11 فروردین 1390, 17:36 عصر
علی جان

کد محسن جون مشکلی نداره فقط در کدی که بهت داده بودم در تابع ( loaddata ) باید DataTable خالی میشد همین . هر تغییری خواستی بده بعد روی دکمه ثبت تغییرات کلیک کن .

یعنی باید اینجوری بشه :

Sub loaddata()
dt.Clear()
ad = New OleDbDataAdapter("Select * from Table1", cnnstring)
cmdb = New OleDbCommandBuilder(ad) 'this object can make sql command for every change in data table
ad.Fill(dt)
grdAuthorTitles.DataSource = dt
End Sub

موفق باشید ./

ali190
پنج شنبه 11 فروردین 1390, 18:05 عصر
سلام
کد رو اصلاح کردم
رکوردها دو برابر نشد ولی تغییری هم صورت نگرفت
اگر امکانش هست راهنماییم کنید
ممنون و متشکر
یاعلی

alimanam
پنج شنبه 11 فروردین 1390, 18:29 عصر
رکوردها دو برابر نشد ولی تغییری هم صورت نگرفت

شما تغییرات رو کجا اعمال میکنین توی تکس باکس ها ؟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!! اگه آره !!! خوب معلومه که تغییرات ثبت نمیشه چون تکس باکس ها رو به صورت دینامیکی دارین مقدار دهی میکنین و هیچگونه اتصالی با دیتابیس ندارن شما تغییرات رو دیتاگرید انجام بده بعد روی دکمه ثبت تغییرات کلیک کن میبینی که تعییرات ذخیره میشه .

موفق باشید ./

ali190
پنج شنبه 11 فروردین 1390, 18:35 عصر
سلام
الان متوجه شدم
پس در حقیقت دیتاگرید در اینجا نقش همون دیتاسا رو بازی میکنه و کلیه تغییرات از دیتاست به دیتابیس منتقل میشه ، اونم توسط dataadapter
ممنون
یاعلی

ali190
جمعه 12 فروردین 1390, 22:19 عصر
سلام
من میخوام از طریق DATAADAPTER (همون روشی رو آقا محسن به من گفتند) دیتابیسم رو بروز رسانی کنم ولی ارور میگیرم

68154


فایل پروژه ام رو جهت بررسی خدمتتون قرار میدم
یه سئوال دیگه هم از خدمتتون داشتم:
در فانکشن زیر
Sub loaddata()
dt.Clear()
ad = New OleDbDataAdapter("Select * from Table1", cnnstring)
cmdb = New OleDbCommandBuilder(ad) 'this object can make sql command for every change in data table
ad.Fill(dt)
grdAuthorTitles.DataSource = dt
End Sub


چرا از OleDbCommandBuilder استفاده شده؟
فلسفه وجود اسن شئی برای چیه؟ و اصولاً چه کاری رو انجام میده؟


ممنون
یاعلی
http://barnamenevis.org/images/misc/pencil.png

محسن شامحمدی
یک شنبه 14 فروردین 1390, 11:47 صبح
محسن جان کدی که پشت دکمه "ثبت تغییرات" گذاشتی درست عمل نمیکنه ، فقط تعداد رکوردهامو دو برابر میکنه!؟
اون رو که علی جان زحمت کشیدن و گفتن


آیا من با همین dataadapter میتونم insert و delete رو هم انجام بدم؟
اون کدش چطوره؟
بله
کدش همینه و نیازی به تغییر نداره
یعنی همین کد عملیات insert,delete رو هم به بانک منعکس می کنه

محسن شامحمدی
یک شنبه 14 فروردین 1390, 13:23 عصر
دیتابیسم رو بروز رسانی کنم ولی ارور میگیرم
این خط
Dim ad As OleDbDataAdapter
رو به
Dim ad As New OleDbDataAdapter
تغییر بده

چرا از OleDbCommandBuilder استفاده شده؟
فلسفه وجود اسن شئی برای چیه؟ و اصولاً چه کاری رو انجام میده؟

این شی dataset ,datatable و data adapter رو بصطور کامل مورد تجزیه وتحلیل قرار می ده و تمام تغییرات رو متوجه می شه و در آخر برای تمام تغییرات انجام شده دستور Sql تولید می کنه.
اگر این شی وجود نداشته باشه شما باید برای تک تک تغییرات دستور sql اجرا کنید تا به بانک منعکس بشه.