PDA

View Full Version : پر کردن dataset یکبار برای همیشه



seeker
پنج شنبه 04 بهمن 1386, 13:06 عصر
با سلام
با توجه به اینکه fill کردن dataTable های dataSet زمان بر است آیا امکان این وجود دارد که ما در شروع برنامه تمام dataTable ها را در dataSet و fill کنیم تا دیگر هنگام load شدن فرمها نیازی به اینکار نباشد؟
من اینکار رو کردم. یعنی وقتی اولین فرم برنامه باز میشه همه رو fill میکنه ولی توی بقیه فرمهام هیچ رکوردی دیده نمیشه

Daren_the_Devil
پنج شنبه 04 بهمن 1386, 18:59 عصر
دوست من اصولا استفاده از کنترل dataset و bindingsource کار بدرد نخوریه (این فقط نظر منه) شما بهتره یک کلاس دیتا داشته باشی و با کد یعنی ساختن Object های connection و adapter و dataset به دیتابیس وصل بشی مثل زیر :


Imports System.Data.oledb
PublicClass Data
Dim oConnection AsNew OleDbConnection(System.Configuration.Configuration Settings.AppSettings.Item("ConnectionString"))
Dim oAdapter AsNew OleDbDataAdapter("SELECT * FROM tbl_Contact", oConnection)
Dim DS AsNew DataSet
Sub Fill()
DS.Clear()
oAdapter.Fill(DS)
EndSub
Function View() As DataView
Fill()
Return DS.Tables(0).DefaultView
EndFunction
EndClass

از این به بعد کافیه فقط در form load این رو بنویسی :


PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load

dim oData as new data
grid.datasource = oData.view

EndSub

seeker
پنج شنبه 04 بهمن 1386, 19:49 عصر
با تشکر از شما
ولی اینکه بازم همون شد
یعنی تو هر فرمی که قراره دیتا نشون بده من باید این کلاس رو فرا خوانی کنم. خوب کلاس رو که فرا خوانی کردم کلاس میاد ds رو fill میکنه و دوباره همون معطلی لود شدن هر فرمی که دیتا نشون میده
سوال من این بود که چطور میشه یکبار تو اولین فرم (مثل splash screen ) فقط یکبار ds رو fill کنیم و این جناب ds پرشده بمونه. بعد وقتی فرمهایی رو که قراره دیتا نشون بدن رو وصل کنیم به این ds که قبلا پر شده خوب دیگه معطلی نداره.

Daren_the_Devil
جمعه 05 بهمن 1386, 12:34 عصر
خیلی ببخشید که متوجه منظور دقیقتون نشدم
مطمئن نیستم ولی این کار باید جواب بده : توی ApplicationEvents و در Startup Event یکبار ds رو fill کن.

iman_s52
جمعه 05 بهمن 1386, 20:43 عصر
بعد برای مشاهده تغییرات چکار میکنید ؟؟؟ دوباره باید ds رو Fill کنی؟؟

saman_itc
جمعه 05 بهمن 1386, 21:00 عصر
آقای iman_s52 (http://barnamenevis.org/forum/member.php?u=7091) دقیقا درست میگن
ولی میشه تیکه تیکه این کارو کرد

visual_sadegh
شنبه 06 بهمن 1386, 07:22 صبح
می تونی یک ماژول کد به پروژه اضافه کنی بعد یه دیتاست با کد بصورت پابلیک تعریف کنی و اونو در زمان اجرای پروژه پر کنی از اون به بعد می تونی با متد کپی اطلاعات را از دیتاست اصلی به دیتاست فرم هات کپی کنی،
توصیه من هم
ولی میشه تیکه تیکه این کارو کرد همینه

saman_itc
شنبه 06 بهمن 1386, 08:38 صبح
آقای seeker (http://barnamenevis.org/forum/member.php?u=24036) شما با DateGrid کار میکنید؟

seeker
شنبه 06 بهمن 1386, 08:55 صبح
ولی این کار باید جواب بده : توی ApplicationEvents و در Startup Event یکبار ds رو fill کن.
من تقریبا همین کار رو به شکل دیگه ای انجام دادم ولی نشد چون فقط تو ds همون فرمی که کار اسارت آپ رو انجام میده پر میکنه


بعد برای مشاهده تغییرات چکار میکنید ؟؟؟ دوباره باید ds رو Fill کنی؟؟

نه چون شما وقتی یک فیلدی رو تغیر میدی و update میکنی تغیراتت توی ds اعمال شده و لازم نیست که ds دوباره fill بشه.

ولی میشه تیکه تیکه این کارو کرد
چطور؟ میشه بیشتر توضیح بدین؟

می تونی یک ماژول کد به پروژه اضافه کنی بعد یه دیتاست با کد بصورت پابلیک تعریف کنی و اونو در زمان اجرای پروژه پر کنی از اون به بعد می تونی با متد کپی اطلاعات را از دیتاست اصلی به دیتاست فرم هات کپی کنی،

این تئوری خوبی به نظر میاد ولی اولا آیا اون دیتا ست پابلیک همیشه پرشده باقی میمونه (منظورم در طول مدت اجرای برنامست)
دوما چطور از اون ds به این ds کپی کنم؟


آقای seeker (http://barnamenevis.org/forum/member.php?u=24036) شما با DateGrid کار میکنید؟

بله. از dgv هم فقط برای گزارش گیری استفاده میکنم.

saman_itc
شنبه 06 بهمن 1386, 09:03 صبح
چطور؟ میشه بیشتر توضیح بدین؟


بله. از dgv هم فقط برای گزارش گیری استفاده میکنم.
با Select Limit مثل گوگل که 100000 تا نتیجه رو یه جا Fill نمیکنه
بسته به هر صفحه که روش هستی داره

Dariuosh
شنبه 06 بهمن 1386, 09:10 صبح
آخه پرکردن DataSet اول برنامه یه ذزه اشکال داره !
پس تکلیف DirtyRead چی میشه
بعد تازه اونوقت زمان لود اول برنامه هم خیلی بالا میره
حالا برا باز شدن فرما یه ذزه خوب صبر کنن !

seeker
شنبه 06 بهمن 1386, 09:20 صبح
اولا از توجه همه دوستان به این مشکل متشکرم و فکر میکنم که حل شدن این مسئله نه تنها به من کمک میکنه بلکه میتونه یه الگو برای حل مسائل مشابهی که دیگر دوستان هنگام کار با dataBase های حجیم با اونها برخورد میکنن باشه
من یکبار مسئله رو شرح میدم:
ما یک دیتا بیس داریم با 17 تا جدول که تعداد فیلدهای جداولمون از 5 فیلد تا 80 فیلد متفاوته (حالا یا رو اکسس یا رو SQL Server فرقی تو مسئله نداره)
البته نا گفته نمونه که این جداول تا حد امکان نرمال سازی شدند.
خوب اول اومدم مث همه برنامه هایی که تا حالا نوشتم موقع لود شدن هر فرمی که قراره دیتا بهم نشون بده یا قراره دیتا تغییر بده یه بار dataTable اون فرم رو fill کردم
اما مشکل: الان که من دارم برنامه رو مینویسم و بصورت local به DB وصل میشم بسته به حجم فیلدی و حجم رکوردی جداول؛ تو بعضی فرمهام 8-10 ثانیه طول میکشه تا دیتا تیبلم پر بشه. حالا فرض کنید این برنامه بره رو یه نت ورک کوچیک. احتمالا جدولی که الان 10 ثانیه ای پر میشه اونجا 20 ثانیه طول میکشه.
من تا پنج شنبه نمیدونستم که وقتی DS پر میشه فقط برای اون فرمی که توش داری پرش میکنی پر میشه و این پر شدن جاهای دیگه نیست. واسه همینم فکر کردم که ما هنگاوی که برنامه اجرا میشه کل dataTable هامون رو فیل کنیم (مثلا 1-2 دقیقه طول میکشه) ولی دیگه معطلی نداریم و هر فرمی که لود میشه دیتا تیبل هاش قبلا پر شدن. ولی اینکار عملی نبود چون وقتی من توی یک فرم دیتا تیبلم رو پر کنم توی یه فرم دیگه همون دیتا تیبل خالیه و باید دوباره پر بشه.
حالا به نظر شما چیکار کنیم که کاربر فقط یکبار درد بکشه ;) (یعنی معطل fill شدن بشه). حالا این یکبار معطلی هرچقدر هم که زیاد باشه باز هم می ارزه تا اینکه وسط برنامه هی بخواد واسه باز کردن هر فرمی کلی صبر کنه.
من مطمئن هستم که این کار شدنیه چون توی یه برنامه ای دیدم که اینجوری بود. ولی بخاطر یکسری مسائل نمیتونم از نویسنده اون برنامه سوال کنم که چطور اینکارو کرده

visual_sadegh
شنبه 06 بهمن 1386, 11:34 صبح
ین تئوری خوبی به نظر میاد ولی اولا آیا اون دیتا ست پابلیک همیشه پرشده باقی میمونه (منظورم در طول مدت اجرای برنامست)
دوما چطور از اون ds به این ds کپی کنم؟

dataset1=dataset2.copy
چون پابلیک تعریف شده خوب حتما پر می مونه

Sub Zero
شنبه 06 بهمن 1386, 12:18 عصر
روش پیشنهادی من اینه که از یه ماژول برای این کار استفاده کنید.در رویداد لود اولین فرمتون با فراخوانی پروسه مربوط به پر کردن دیتاست که در ماژول نوشته شده اونو پرکرده و در فرمهای دیگه ازش استفاده کنید.

visual_sadegh
شنبه 06 بهمن 1386, 12:27 عصر
اگر که فقط قراره جداول بخصوصی عمومی باشند به نظر من بهتره که در سطح Datatable کار کنید یعنی یک یا چند دیتاتیبل بصورت عمومی تعریف بشن

seeker
شنبه 06 بهمن 1386, 14:01 عصر
با تشکر از همه
ببینید من فعلا این کار هارو کردم:
1- یک ماژول ساختم به این صورت:


Module Module1
Public ctDataset1 AsNew ctDataSet
Dim partTableAdapter1 AsNew ctDataSetTableAdapters.partTableAdapter
Dim personTableAdapter1 AsNew ctDataSetTableAdapters.personTableAdapter
Dim contractorTableAdapter1 AsNew ctDataSetTableAdapters.contractorTableAdapter
Dim tipsTableAdapter1 AsNew ctDataSetTableAdapters.tipsTableAdapter
PublicSub fll()
ctDataset1.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema
contractorTableAdapter1.ClearBeforeFill = True
partTableAdapter1.ClearBeforeFill = True
personTableAdapter1.ClearBeforeFill = True
tipsTableAdapter1.ClearBeforeFill = True
contractorTableAdapter1.Fill(ctDataset1.contractor )
partTableAdapter1.Fill(ctDataset1.part)
EndSub
EndModule


2- تو اولین فرم fll رو فرا خوانی کردم
3- تو فرم لود یکی از فرمهایی که قراره دیتانشون بده گفتم:

Me.ctDataSet1 = module1.ctDataSet1.Copy

آیا اینها درستند؟
پس چرا کار نمیکنه؟

Sub Zero
شنبه 06 بهمن 1386, 14:59 عصر
این یکی اجرا میشه . تو 10 دقیقه درستش کردم وجواب هم داد . بقیه تغیراتش با خودت .

seeker
شنبه 06 بهمن 1386, 16:37 عصر
سلام
بدون هیچ مشکلی کار میکنه
ولی تو زمان لود شدن فرمها هیچ تاثیری نداره.
یعنی اگر هنگام باز شدن فرم ds فرم رو fill کنم load شدنش دقیقا همونقدر طول میکشه که اگر بایندش کنم به ds عمومی تو ماژول که قبلا fill شده.
چرا؟!؟!؟! چه باید کرد؟

mazoolagh
شنبه 06 بهمن 1386, 22:15 عصر
من چندان از دیتاست و متدهای حاضر و آماده اش خوشم نمیاد هر چند که کار کدنویسی و نگهداری خیلی رو راحت میکنه.
از دیتاتیبل های پابلیک استفاده میکنم و در شروع app همه رو یکجا با یک دیتاریدر پرمیکنم. برای insert,update,delete هم کد مینویسم و تغییرات رو مستقیم و بدون دیتاآداپتر به دیتابیس اعمال میکنم. سریع ولی به قیمت هزینه کدنویسی و نگهداری.

scorpion_man
شنبه 06 بهمن 1386, 23:17 عصر
با سلام به همه دوستان
برای انجام این عملی که شما طرح کردید همین راه حل صحیحه یعنی ایجاد یه module با یه dataset به صورت عمومی و به نظر میاد راه دیگه ای نباشه اما کار چندان خوب و حرفه ای نیست چون بالاخره شما دارید از حافظه تون استفاده میکنید و dataset ها مقیم تو حافظه هستند ولی با استفاده از limit ها شما فقط قسمتی رو وارد حافظه میکنید و برنامتون performance بالایی خواهد داشت حالا به هر دلیلی شما مایل به انجام این کار هستید محترم

اما برا اینکه اختلالی تو بالا اومدن برنامتون پیش نیاد پیشنهاد میکنم از حالت multi threading استفاده کنید و dataset fill رو رو یه thread جداگانه انجام دهید تا زمان fill کردن اختلالی تو برنامتون پیش نیاد
موفق باشید

visual_sadegh
یک شنبه 07 بهمن 1386, 07:37 صبح
دوست عزیز نظر من اینه
اگه مشکل شما لود کردن جداول پایه نیست یعنی اجباری به لود شدن همه رکورد ها در حافظه نیست سعی کن اطلاعات رو از حافظه رکورد به رکورد بگیری.
مثلا یه برنامه داری که قراره بر روی 150،000 رکورد کار کنه ، فکر نمی کنم شما بخوای همزمان بر روی تمام رکورد ها کار کنی برای اینکار بهتره با ایجاد query و دستور select فقط رکورد مورد نظرت رو بار کنی.
من مشکل خودم رو بر روی جداول با رکورد بالا اینطوری حل کردم.
حتی برای جستجوی از Select Top 20 استفاده کردم که فقط بیست رکورد اول رو از پایگاه داده بگیره.
آیا دلیل خاصی وجود داره که می خوای تمام رکورد هات رو fill کنی؟

seeker
یک شنبه 07 بهمن 1386, 10:28 صبح
آیا دلیل خاصی وجود داره که می خوای تمام رکورد هات رو fill کنی؟
نه
حق با شماست
اصلا روش از اول اشتباه بود
چون فیل کردن اول برنامه کلی از ram رو اشغال میکنه و در ضمن مشکلات بعدی بوجود میاره
بهترین راه راه حل پیشنهادی دوستانه که رکورد ها رو کم کم بخونم. هم برنامه سبک میشه هم سرعتش بیشتر میشه
به هر حال از همه دوستان که کمک کردن ممنونم برای من که تجربه خوبی شد

babakj
دوشنبه 08 بهمن 1386, 20:18 عصر
شما می تونی از یک dataset اشتراکی استفاده کنی
فقط مطمین نیستم چه مقدار حافظه اشغال می کنه
امتحان کن و نظرتو بگو بهم

Public Shared MyDataSet as new system.data.dataset

scorpion_man
سه شنبه 09 بهمن 1386, 00:53 صبح
شما می تونی از یک dataset اشتراکی استفاده کنی
فقط مطمین نیستم چه مقدار حافظه اشغال می کنه
امتحان کن و نظرتو بگو بهم

Public Shared MyDataSet as new system.data.dataset

عزیزم بحث از اول تا آخرش سره همین dataset اشتراکیه که عرض شد استفاده dataset به صورت اشتراکی از نظر استفاده از حافظه اصلا مقرون به صرفه نیست
موفق باشید