واضح آرشیو وب فارسی:سایت ریسک: MTPROG30-01-2010, 05:55 PMاگر یک Query رو تو محیط Access یا SQL SERVER اجرا کرده باشید اگر حجم زیادی از اطلاعات همراه query مورد نظر بیاید.میبینید که رکوردها کم کم نمایش داده میشوند و کاربر نمایش اطلاعات رو به صورت تدریجی میبینه. اما اگر این query رو تو محیط VS اجرا کنی تا نمایش کل رکوردها نمیشه هیچ چیزی رو مشاهده کرد و کاربر تا لحظه نهایی چیزی مشاهده نمیکنه که برای گزارشهای سنگین زیاد کاربر پسند نیست. اگر کسی نکاتی در این مورد میدونه ممنون میشم ذکر کنه با تشـــــــــــــــــــــــ کر _H2_06-02-2010, 12:26 AMسلام DataSet یکسری رویداد دارد که وقتی تغییرراتی مکیند با جایی مثل گراید با این رویدادها میتواند مطلع شود و خودش را Refresh کند. DataAdapter در جهت سرعت عمل بیشتر کل این رویدادهای DataSet را متوقف میکند و در آخر کارش فعال میکند و نتیجتاً گراید فقط یکبار Refresh میشود و سرعت افزایش می یابد. ===== راه حل: الف) از یک تصویر gif یا avi انتظاری استفاده کنید تا کار تمام شود و گراید را مرئی کنید !!! ب) برای Fill از DataAdapter استفاده نکنید! زیاد هم سخت نیست، خودم براها به دلالی مختلف دیگر انجام داده ام. Connection و Command و DataReader را میسازید ... DataReader را در یک حلقه While می خوانید ... با هر خواندن دستی یک سطر به DataSet.DataTable اضافه میکنید. البته من باز هم پیشنهاد میکنم شما هم جلوی رویدادها و ایندکس گذاری مدام DataTasble را بگیرید! چون اگر قرار باشد با هر یک سطر که اضافه میشود DataGridView هم یکبار Refresh شود دیگر افتضاح میشود و باید برای کاربران لحاف و دوشک هم بخرید تا جلوی رایانه خوابش نبرد!!!! ولی حداقل رویدادها را به اضای هر 10 یا 100 سطر متوق کنید. یعنی یک شمارنده بگذارید که وقتی به 10 یا 100 و... رسید یکبار DataTable را عادی کند (EndLoadData) و مجدد قفل کند (BeginLoadData) و... دقت کنید هر BeginLoadData یک EndLoadData داشته باشد و تعداد این دو متد در کدتان همدیگر را خنثی کند. موفق باشید. MTPROG06-02-2010, 10:05 AMDataSet یکسری رویداد دارد که وقتی تغییرراتی مکیند با جایی مثل گراید با این رویدادها میتواند مطلع شود و خودش را Refresh کند. میشه این رویدادها رو نام ببرید.شاید راه حل در اون باشه. تو دلفی دیتا ست رویدادی داره به نام Change که اگر دیتاست تغییری کرد اطلاعاتش آپدیت میشه. شاید بگید این روش خیلی کند میشه ولی میتونه در بعضی شرایط مزایای خیلی خوبی داشته باشه .مثلا کاربر دنبال اطلاعات نامشخصی میگرده با این روش به محض روئیت رکورد مورد نظر میتونه عملیات رو متوقف کنه و کلی منتظر نمونه الف) از یک تصویر gif یا avi انتظاری استفاده کنید تا کار تمام شود و گراید را مرئی کنید !!! از این تصاویر همیشه تو کارهام استفاده میکنم. ) برای Fill از DataAdapter استفاده نکنید! زیاد هم سخت نیست، خودم براها به دلالی مختلف دیگر انجام داده ام. Connection و Command و DataReader را میسازید ... DataReader را در یک حلقه While می خوانید ... با هر خواندن دستی یک سطر به DataSet.DataTable اضافه میکنید. این روش جوابگو نیست.چون خود دستور Command هم باید تا گرفتن کل رکوردها از بانک منتظر بمونه و به یکباره تمام رکوردها رو میگیره.عملا هیچ منفعتی نسبت به روش قبلی نداره (البته به جز کمی سرعت بیشتر)تازه یه مقدار هم باید سورس اضافه بنویسی . _H2_06-02-2010, 03:46 PMسلام میشه این رویدادها رو نام ببرید.شاید راه حل در اون باشه شی اصلی که مجموعه را نگه داری میکند DataTable است ورویدادهای متعددی دارد... RowChanged و RowChanging و TableNewRow و... و... و... تازه معمولاً نمونه ای از DataView هم ساخته میشود و گراید به آن وصل میشود. شما همینطوری نمیتواند در رویدادهای این اشیا دست ببرید و نتیجه موثری نخواهد داشت! این رویدادها و ایندکس بندی با متد BeginLoadData کلاً متوقف میشود که در اول DataAdapter.Fill فراخوانی میشود و با EndLoadData به جریان می افتد (در اخر DataAdapter.Fill) شما باید با این دو متد این ها را کنترل کنید. این روش جوابگو نیست.چون خود دستور Command هم باید تا گرفتن کل رکوردها از بانک منتظر بمونه و به یکباره تمام رکوردها رو میگیره نه جانم جواب میدهد. مطمئن باشد. شما تحلیل درستی نداشتید. با اجرای متد ExecuteReader از Command یک DataReader نسبتاً خیلی سریع بر میگردد. سپس این DataReader متدی با نام Read دارد که با هر فراخوانی اش فقط و فقط یک سطر خوانده میشود ... !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! کاری که DataAdapter.Fill میکند ان است که بعد از پایان حلقه while متد EndLoadData را اجرا میکند و نتیجتاً بعد از خوانده و اضافه شدن تمام سطرها Refresh انجام میشود. کاری که من گفتم یا اصلاً BeginLoadData را اجرا نمیکنید که DataTable قفل شود یا در درون حلقه while بعد از اضافه شدن هر چند سطر یکبار DataTable را آزاد میکند. اصولاً در همه زبانهای برنامه نویسی فقط کارهایی زمان میبرد و کاربر را منتظر میگذارد که داخلش یک جوری حلقه دارد که نمونه بارز ان حلقه while و for است. DataAdapter خودش این حلقه را تشکیل داده و اخرین Refresh میکند، شما میتوانید خودتان حلقه را بنویسید و هر جایی در حلقه خواستید یک بار Refresh کنید! کدی که حلقه اش را خودتان نوشته اید هم میتواند "نوار پیشرفت" و "درصد" داشته باشد و هم Refresh های نسبی تا پایان عملیات! خیلی واضح است. موفق باشید. MTPROG06-02-2010, 03:58 PMسپس این DataReader متدی با نام Read دارد که با هر فراخوانی اش فقط و فقط یک سطر خوانده میشود ... اگر با اجرای command مورد نظر تمام رکوردها (مثلا 1000 رکورد ) باز خوانی نشه و فقط با اجرای دستور Read در یک حلقه این کار یکی یکی انجام بگیره خوب روش درسته. من فکر میکردم که datareader هم مانند DataAdapter کل اطلاعات رو با هم میاره میرم تست کنم ممنون MTPROG06-02-2010, 04:05 PMراستی یک سئوال دیگه اگه قرار باشه dataReader برای خوندن هر رکورد به دیتا بیس متصب بشه برای حجم زیاد مشکلی پیش نمیاره؟ _H2_06-02-2010, 04:43 PMسلام اگه قرار باشه dataReader برای خوندن هر رکورد به دیتا بیس متصب بشه برای حجم زیاد مشکلی پیش نمیاره؟ وظیفه وصل شدن با Connection است که یکبار اول عملیات Open و در پایان ان Close میشود. DataReader فقط وظیفه انتقال را بر عهده دارد و مطلب بعدی را هم بخوانید .... من فکر میکردم که datareader هم مانند DataAdapter کل اطلاعات رو با هم میاره اصل و سنگ بنای ارتباطی ADO.Net بر مبنای سه شی اصلی Connection (برقراری ارتباط) و Command (اجرای دستورات روی بانک) و DataReader (خواندن جواب دیتابیس) استوار است. الآن در ADO.Net سه ابزار به ظاهر مجزا جهت برقراری ارتباط با دیتابیس ها داریم. الف) DataSet/DataAdapter ب) Entity Data Model ج) LINQ to SQL ولی نکته جالب و توجه و بنیادین انجا است که هر سه ابزار فوق خودشان برای کارکرد از سه شی پایه ای Connection و Command و DataReader استفاده میکنند. یعنی در واقع پایگاه ها و دروازه های ارتباط با بانک های اطلاعاتی این سه شی هستند. تمام ابزار و امکانات دیگر دات نت فقط برای سادگی برنامه نویسی طراحی شده اند و خودشان در نهایت کار را با این سه شی انجام میدهند. متد DataAdapter.Fill در واقع خیلی شبیه همان کد نمادین است که من در پست قبلی ام نوشتم. یعنی خود این متد واقعاً یک شی DataReader میسازد و ان را در یک حلقه Read میکنید و فیلدهای داخل آن را با کلاس دیگری Map میکند به فیلدهای نظیر در DataTable . متد DataAdapter.Update هم باز حلقه ای روی DataTable تشکیل داده و تک تک سطرهای درج شده و ویرایش شده و حذف شده DataTable را جدا میکنید و هر کدام را به یکی از سه Command ویرایشی که دارد Map میکند. ===== اگر شما شاهد هستند در موارد خاص و برخی دستورات این سه ابزار (LinqToSql و Entity و DataAdapter) فوق الذکر سرعتشان از همدیگر بیشتر میشود به خاطر این است که در ان دستورات خاص استفاده بهتری از Connection و Command و DataReader داشته اند وگرنه سه شی پایه ثابت هستند. طبیعتاً هر چه شما لایه های بین خودتان و منبع را کنار بزنید به سرعت بیشتری خواهید رسید. اگر شما خودتان در یک حلقه while یک DataReader را صحیح و با کد مناسب بخوانید میتوانید به چندین برابر سرعت هر یک از LinqToSql و Entity و DataAdapter برسید. (مثلاً بهتر است فیلدهای را با نام string شان ارجاع ندهید و دستورات داخل حلقه را حداقل کنید.) ===== البته در این مورد خاص احتمال زیادی دارد سرعت شما کمتر از DataAdapter.Fill شود ! ولی این کمتر شدن سرعت به دلیل وصل شدن به سرچشمه سرعت DataReader نیست بلکه ناشی از آن میشود که شما میخواهید یک ایندکس بندی DataTable و یک نمایه DataGridView را مدام Refresh کنید !!!! طبیعی است که سرعتتان کمتر میشود ولی از ناحیه این دو Refresh اجباری در دو کلاس حجیم. موفق باشید. MTPROG14-02-2010, 09:23 AMیه روش استاندارد پیدا کردم اونم استفاده از dataReader به وسیله IAsyncResult !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! دانلود نمونه سورس کامل http://assets.devx.com/sourcecode/11446.zip سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 2142]