PDA

View Full Version : دو تا سوال در خصوص بانک اطلاعاتی و DataGrid



روح اله معینی زاده
چهارشنبه 21 بهمن 1383, 15:21 عصر
با سلام خدمت تمامی دوستان

بدون مقدمه

1- چه طور بفهمیم که کدام خانه از Data Grid دچار تغییر شده است؟

2- چه طور باید Data Adapter را با متد Update آن به کار برد وقتی که اطلاعات آن تویسط یک Data Set در Data Grid ریخته شده است؟ منظور اینکه اطلاعات ویرایش شده‌ی درون Data Grid را در بانک اطلاعاتی دوباره ذخیره کنیم؟

ببخشید

با احترام- خدانگهدار

علیرضا مداح
جمعه 23 بهمن 1383, 17:46 عصر
سلام .

1) برای اینکار میبایست از تایع GetChanges مربوط به شی ء دیتاست استفاده نمایید که در زیر طریقه استفاده از آن آمده است . این تابع دارای دو فرمت میباشد که در زیر آمده است :

Public Function GetChanges() As System.Data.DataSet
با فراخوانی این تابع ، یک کپی از دیتاست مورد شما که شامل تمام رکوردهای تغییر یافته(در تمام جداول موجود در دیتاست که شامل رکوردهای حذف شده ، تغییر یافته ، تغییر نیافته و اضافه شده میباشد . ) از آخرین باری که متد AcceptChanges مربوط به آبجکت دیتاست فراخوانی شده و یا دیتاست در حافظه بارگذاری شده است را برمیگرداند .

Public Function GetChanges(ByVal rowStates As System.Data.DataRowState) As System.Data.DataSet
در اینجا نیز تابع GetChanges همانند فرمت قبلی خود رکوردهای تغییر یافته را در یک کپی از شی ء دیتاست برمیگرداند با این تفاوت که در اینجا شما میتوانید رکوردهای تغییر یافته را با استفاده از مقدار شمارشی DataRowState فیلتر نمایید .
این مقدار شمارشی دارای چهار ثابت میباشد :

Detached = 1
UnChanged = 2
Added = 4
Deleted = 8
Modified = 16


UnChanged
سطرهایی که هیچ تغییری در آنها رخ نداده است انتخاب مینماید. (از آخرین باری که متد AcceptChanges مربوط به شی ء دیتاست فراخوانی شده است)

Added
سطرهایی که به شی ء DataRowCollection اضافه شده است (از آخرین باری که متد AcceptChanges مربوط به شی ء دیتاست فراخوانی شده است)

Deleted
سطرهایی که از شی ء DataRowCollection توسط متد System.Data.DataRow.Delete حذف شده اند (از آخرین باری که متد AcceptChanges مربوط به شی ء دیتاست فراخوانی شده است)

Modified
سطرهایی که دچار تغییر شده اند ((از آخرین باری که متد AcceptChanges مربوط به شی ء دیتاست فراخوانی شده است)

همچنین شی ء DataTable نیز دارای تابع GetChanges میباشد ، با این تفاوت که این تابع یک کپی از شی ء DataTable که تمام رکوردهای تغییر یافته از آخرین باری که متد AcceptChanges مربوط به آبجکت DataTableفراخوانی شده و یا شی ء DataTable در حافظه بارگذاری شده است را برمیگرداند .

روح اله معینی زاده
شنبه 24 بهمن 1383, 08:33 صبح
با سلام خدمت دوست گرامی

از جواب شما بسیار متشکرم

و اما ...

من چگونه بفهمم که کدام ستون جدول دچار تغییر شده است؟ چون برای به روز رسانی نیاز دارم بگویم:

به روز رسانی کن
ستون‌های الف، ب، پ و ...
وقتی
ستون x برابر y باشد

بنابراین نیاز دارم بدانم که کدام ستون تغییر کرده تا بر اساس ستون‌های دیگر فقط همان را به روز رسانی کنم.
اگر هم غیر از این راهی هست که من نمی دانم، خوشحال می شوم مرا راهنمایی کنید، چون ممکن است ستون تغییر نیافته در Data Grid در چند رکورد تکرار شده باشد که این امر به روز رسانی را دچار اشکال می کند.

با احترام- خدانگهدار

dotnet
یک شنبه 25 بهمن 1383, 10:28 صبح
برای اینکار میبایست از تایع GetChanges مربوط به شی ء دیتاست استفاده نمایید
علیرضا مداح درست میگه

قسمت اول سوالت تقریبا حرفه ای اما خودتو داری میپیچونی . شما هدف نهائیتون اینه که تغییرات رو ذخیره کنید برای این کارهم شما نمیتونید مستقیما از شئ جدول تو دیتاستتون چند ستون یا سطر خاص رو اپدیت کنی مگر اینه یک شئ جدول واسطه بسازی بعد جاهایی که میخوای جدا تغییر اتشون ذخیره بشن رو بفرستی اونجا و از اونجا کارت رو ادامه بدی . هرچند این راه حل منطقی نیست .
پس بهتره به روش نرمال کار طراحیت رو تغییر بدی که اصلا نیازی به این قسمت پیدا نکنی.
ولی قسمت دوم سوالت نسبت به سوال اول جوریه که شک بر انگیزه در هر صورت قسمت دوم جوابش اینه : ....
(me.dataadapter.update(me.dataset.table
یعنی شئ جدول ساخته شده تو دیتاستت رو قبل از متد اپدیت کنار دیتا ستت بیاری البته میتونی به نام شئ جدولت هم مستقیما اشاره کنی و هم اصلا نام شئ جدولت رو نیاری.
شاید هم سوالت رو ما نفهمیدیم اگه اینطوره واضحتر بگو احتمالا براش جواب دارم. :flower:

روح اله معینی زاده
یک شنبه 25 بهمن 1383, 13:38 عصر
با سلام خدمت دوستان گرامی

آقا اصلا بذارید این جوری بگم که اون Accept Changeی که می گید بعد از اون تابع GetGhage عمل می کنه و مقادیر تغییر کرده رو در خودش نگه می داره، چه چوری باید به سیستم اعمال کنم؟

منظورم اینه که من در Data Grid تغییراتی داده‌ام و حالا می خوام بدون استفاده از هیچ دستور SQLی، این تغییرات را در بانک ذخیره کنم، آیا باید با دستور

DataSet.Tables("x").AcceptChange
این کار را انجام بدهم یا روش دیگری وجود دارد؟

با احترام - خدانگهدار.

علیرضا مداح
یک شنبه 25 بهمن 1383, 22:09 عصر
وقتی که شما متد AcceptChanges مربوط به دیتاست را فرخوانی میکنید ، تمام سطرهایی که هم اکنون در حالت ویرایش هستند(در تمام جدول ها) از حالت ویرایش خارج شده و تغییرات آنها به طور موقف اعمال میشود . در این هنگام است که خاصیت RowState مربوط به شی ء DataRow تغییر میکند بدین صورت که سطرهایی که State آنها Deleted بوده حذف میشوند و سطرهایی که State آنها Added و یا Modified بوده به صورت UnChanged در می آیند .
به طور خلاصه فراخوانی متد AcceptChanges تمام تغییرات معلق در بانک رو به طور موقف اعمال کرده خاصیت RowState را تغییر میدهد . .

همچنین کلاسهای DataTable و DataRow نیز دارای متد AcceptChanges میباشند که واضح هست که این متد برای کلاس DataTable بر روی تمام سطرهای جدول عمل کرده و در کلاس DataRow تنها بر روی همان سطر عمل میکند .

روح اله معینی زاده
دوشنبه 26 بهمن 1383, 09:42 صبح
با سلام خدمت دوستان گرامی

بابا چرا جواب آخری رو نمی نویسید

خوب، Accept Change تغییرات رو به گفته خودتون به طور موقت ثبت می کنه ولی من که این رو نمی خوام

من می خوام تغییرات در بانک اطلاعاتی اعمال بشه

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

وقتی هم از متد

DataAdapter.Update(DataSet,"table_name")
استفاده می کنم با خطای زیر مواجه می شوم


An unhandled exception of type 'System.Data.Odbc.OdbcException' occurred in system.data.dll

Additional information: System error.


با احترام- خدانگهدار

علیرضا مداح
دوشنبه 26 بهمن 1383, 10:24 صبح
استفاده می کنم با خطای زیر مواجه می شوم


An unhandled exception of type 'System.Data.Odbc.OdbcException' occurred in system.data.dll

Additional information: System error

شما بهتر هست که کد خود را در داخل دستور Try----Catch---End Try قرار دهید تا متوجه شوید که مشکل دقیقا از کجاست . به کد زیر توجه کنید :


Try
OleDbDataAdapter1.Update(DataSet11, "YourTable")
Catch ex As OleDb.OleDbException
MsgBox(ex.Message)
End Try

به هر حال هنگامی که این خطا رخ میدهد احتمالات زیر وجود دارد :

1 - مسیر بانک اطلاعاتی در ConnectionString اشتباه وارد شده باشد .
2 - کلمه عبور بانک کطلاعاتی در ConnectionString اشتباه وارد شده و یا وارد نشده باشد .
و یا هر مشکل دیگری در ConnectionString وجود داشته باشد .
3 - یکی از آبجکت های INSERTCommand,DELETECommand,SELECTCommand,UPDATECo mmand دچار مشکل باشد .
و...

hossein_p30
سه شنبه 30 تیر 1388, 10:23 صبح
برای ذخیره اطلاعات datagridviewدر دیتا بیس از این کد استفاده کن


SqlCommandBuilder objcommandbuilder = new SqlCommandBuilder(objdataadapter);
objdataadapter.UpdateCommand = objcommandbuilder.GetUpdateCommand();
objdataadapter.Update(objdataset,"tablename");
البته خط دوم رو امتحان کن ببین حتما باید باشه یا بدون اونم جواب میده.