PDA

View Full Version : سرعت بالا در دیتاگیرید !!!



leG_big
پنج شنبه 21 دی 1385, 11:18 صبح
سلام دوستان امید وارم که حال همه شما خوب باشه

امروز من و حامد دوست خوبم داشتیم در مورد سرعت دیتاست و SQLDataReader صحبت می کردیم ، و به این نتیجه رسیدیم که بیایم اینجا و ادامه بحث رو ادامه بدیم !!! که دوستان هم با ما هم فکری کنن تا راحلی برای کلیه دوستان پیدا کنیم .



موضوع بحث : محاسبه یک سری از فیلدهای دیتابیس در و ثبت مجدد آنها در دیتابیس .(برنامه محاسباتی)

مدت زمان محسابه (حامد): 365 رکود -> 2 ثانیه (با استفاده از دیتاست + backgroundworker )
مدت زمان محسابه (میثم) : 100.000 رکورد -> 10 ثانیه (با استفاده از SQLDataReader و نمایش در دیتاگرید)

البته حامد جان از JANUS استفاده می کنن برای نمایش ، من از DataGridView .Net2
حالا بحث بر سراینه که از دیتاست و دیتا ریدر کی و کجای برنامه استفاده کنیم !!!!

leG_big
پنج شنبه 21 دی 1385, 11:19 صبح
البته حامد جان از JANUS استفاده می کنن برای نمایش ، من از DataGridView .Net2

----------------------------------------------------------------------------------------------
حالا بحث بر سراینه که از دیتاست و دیتا ریدر کی و کجای برنامه استفاده کنیم !!!!

rezaei manesh
پنج شنبه 21 دی 1385, 11:40 صبح
سلام به همه دوستان
من معمولا ودر برنامه های ویندوزیم از دیتاست استفاده می کنم و اونو به گراید هام وصل می کنم و همچنین برای کلیه عملیات اضافه و ویرایش و... عملیات رو در سطح دیتا ست انجام می دم و در نهایت( حتی بعد از تغییر جند رکورد )دیتا ست رو به بانک انتقال می دم
مزایا می تونم بعد از تغییر اگه کاربر خواست انصراف بده برگردم به حالت اولیه و یا چندتا رکورد تغییر کنه و اگه در نهایت کاربر خواست در بانک قرار بگیره
در ضمن من یک بار اونو پر می کنم و بعد تا آخر کار هر تغییری کرد فقط هون تغییر رو گرید اعمال می شه .در ضمن از دیتا ویو و قابلیت هاش هم می شه استفاده کرد.
اما sqldatareader خیلی سریعتر هست اما فقط برای خواندن اطلاعات استفاده می شه
هر بار اگه تغییری کرد باید دوباره در گراید همه اطلاعات ریخته بشه و البته می شه در بعضی موارد دستی همون رکورد رو در گراید تغییر داد که خودش بعضاً مشکلزاست
در دیتا ست می شه چندین جدول رو وارد کرد و حتی اونا با هم ارتباط داد
خوب من سوادم اینقدر بیشتر نمی کشیه
حالا با این معلومات من یک فرم دارم که یک گراید جانوس داره که شامل 18 فیلد هستش و به صورت ثابت 365 یا 366 رکورد رو شامل میشه که یکی از ستون ها چک باکس و یکی کمبو باکس با عکس و بقیه هم custom هست که برای نصفشون تقویم فارسی و برای نصف دیگه هم یک کنترول برای ورود ساعت است من در گراید اطلاعات رو پر می کنم و چمدین روش برای ورود اطلاعت دارم که یکی از روش ها کپی بخشی از گرید در قسمتی دیگر هست که با گرفتن الگو از بخش اول و انجام محاسبات در بخش دیگرش کپی می شه حالا من برای این کار از دیتا ست استفاده کردم آیا کار درستی انجام دادم؟
لطفا دوستان هرچی در مورد دیتا ست و sqlDataReadr میدونند رو کنند.

leG_big
پنج شنبه 21 دی 1385, 11:47 صبح
دوستان یاری کنین!!!!!!!!!!!!!!!!

sh
پنج شنبه 21 دی 1385, 15:01 عصر
تحقیق کن :




Executing Commands Asynchronously

In ADO.NET 2.0, additional support has been to allow Command objects to execute their commands
asynchronously. This can be a huge perceived performance gain in many applications, especially in
Windows Forms applications. This can come in really handy, especially if you ever have to execute a
long-running SQL statement. We will look at how this new functionality lets us add asynchronous
processing to enhance the responsiveness of an application.

leG_big
پنج شنبه 21 دی 1385, 18:36 عصر
دوست عزیز مرسی
ما تحقیق کردیم . حالا میخوایم از نظرات شما هم بهره مند بشیم

meh_secure
جمعه 22 دی 1385, 23:50 عصر
موضوع بحث : محاسبه یک سری از فیلدهای دیتابیس در و ثبت مجدد آنها در دیتابیس .(برنامه محاسباتی)

مدت زمان محسابه (حامد): 365 رکود -> 2 ثانیه (با استفاده از دیتاست + backgroundworker )
مدت زمان محسابه (میثم) : 100.000 رکورد -> 10 ثانیه (با استفاده از SQLDataReader و نمایش در دیتاگرید)

البته حامد جان از JANUS استفاده می کنن برای نمایش ، من از DataGridView .Net2
حالا بحث بر سراینه که از دیتاست و دیتا ریدر کی و کجای برنامه استفاده کنیم !!!!
شما که از DataReader استفاده می کنی چطور دوباره اطلاعات رو ثبت می کنی؟ همانطوری که دوستان می دونن DataReader بطور یکطرفه و مستقیم اطلاعات رو می خونه وسرعت خیلی بالایی هم داره.

eyelash
شنبه 23 دی 1385, 00:30 صبح
فکر می کنم یکی دیگه از مزایای دیتاست نسبت به دیتا ریدر اینکه بعد از پر شدن دیتا ست میتوان بلافاصله کانکشن را بست ولی در رابطه با دیتاریدر تا وقتی که قراره روی اطلاعات دیتا ریدر کار کرد باید کانکشن باز بمونه و اگه یه جایی فراموش بشه کانکشن را ببندی موقع باز کردن مجدد با خطا روبرو می شی. همچنین از یک دیتاست می توان برای ذخیره یک یا بیش از یک جدول استفاده کرد در حالی که فکر نمی کنم دیتا ریدر این امکان را داشته باشه.

rezaei manesh
شنبه 23 دی 1385, 12:08 عصر
یکی دیگه از مزایای دیتاست نسبت به دیتا ریدر اینکه بعد از پر شدن دیتا ست میتوان بلافاصله کانکشن را بست .
اینم یک نکته دیگه بود .
اما من معمولا کانکشن رو در برنامه های ویندوز باز می زارم تا آخر برنامه (در ضمن موقع باز کردن هم چک می کنم که قبلا باز نباشه)
اساتید لطف کنین کمک کنند.
استفاده هر کدم رو بگید برای داده های کوچک و بزرگ؟

ali_kolahdoozan
شنبه 23 دی 1385, 12:13 عصر
دیتا ریدر رو بیشتر باید برای وب استفاده کرد . از نظر من استفاده از دیتاست هم میتونه برنامه رو کند کنه . من بیشتر از datatable و dataview استفاده میکنم . خود dataview‌ بیشتر قابلیتهای dataset ‌رو داره . البته این نظر منه .

rezaei manesh
شنبه 23 دی 1385, 12:26 عصر
خوب من هم از دیتا ویو استفاده می کنم مخصوصا تا موقعی که با 2003 کار می کردم
اما خود دیتا ویو رو با چی پر می کنی بالاخره باید با دیتاست کارکنی دیگه این طور نیست مگه؟
من الان به این شکل کار می کنم یک فرم دیتا ست دارم که جدولم رو اونجا درست می کنم و اونو پر می کنم و هر جا که نیاز بود از اون استفاده می کنم اما قبلا تویه دیتا ویو می ریختم و تا موقعی که کلاس باز بود از اون استفاده می کردم اما بعد بسته شدن کلاس مجبور بودم دوباره دیتا ست رو پر کنم اما الان دیگه اکثرا اون دیتا ست چون پر هست فقط تغییرات رو اعمال میکنم که فکر کنم بد نیست البته رکورد های من هم معمولا خیلی زیاد نیست اگر هم زیاد باشه همشونو یکجا نشون نمی دم قبلش یه فیلتری می زارم.

ali_kolahdoozan
شنبه 23 دی 1385, 12:34 عصر
بله از دیتا آداپتر استفاده میکنم . برای حتی وب یک query بار زیادی نداره . و من هم از همه رکوردها بیخودی query نمیگیرم . با یک فیلتر عمل میکنم

eyelash
یک شنبه 24 دی 1385, 00:11 صبح
اما من معمولا کانکشن رو در برنامه های ویندوز باز می زارم تا آخر برنامه .


مطمئن نیستم ولی فکر می کنم باز گذاشتن کانکشن ممکنه از منابع سیستم بی مورد استفاده کنه مخصوصا اگه برنامه کمتر با دیتا بیس کار داشته باشه

ali_kolahdoozan
یک شنبه 24 دی 1385, 00:18 صبح
اصلا این سری object بجز datareader و sqlcommand ها کانکشن باز نمیخان . در ضمن توی web که سرور رو این کانکشن باز بیچاره میکنه . بهتره در موارد بیخودی بسته بشه . برای این نوع آبجکتها هم مثل dataset و ... اصلا نیازی نیست باز باشه

meh_secure
یک شنبه 24 دی 1385, 00:25 صبح
یکی از دوستان فرموده بودند که سرعت دیتاست خیلی بالاست. بله این درسته و شکی در اون نیست. اما مثل اینکه همه فراموش کردند که چی میخوان توی دات نت هر ابزاری رو به منظور خاصی تهیه کرده اند. شما برای آپدیت کردن نمی توانید از DataReader استفاده کنید. برای پردازش روی اطلاعاتتون بهتره از Dataset استفاده کنید چون درون حافظه است. برای برگرداندن اطلاعات به بانک مجبورید از Data Adapter یا Command استفاده کنید. پس ببینید کاری کی می خواهید انجام بدهید چی هستش و ابزاری که مخصوص اون کار هست رو بکار بگیرید.

ali_kolahdoozan
یک شنبه 24 دی 1385, 01:16 صبح
سرعت بالای دیتاست جای تامل داره

eyelash
یک شنبه 24 دی 1385, 01:31 صبح
سرعت بالای دیتاست جای تامل داره

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

linux
یک شنبه 24 دی 1385, 02:39 صبح
این تمامی مزیت ها و معایب استفاده از هر دو روش هست
انتخاب هر کدام از این روشها به نرم افزاری که می نویسید بستگی داره و این که می خواهید چکار کنید
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1256">
<meta name=Generator content="Microsoft Word 11 (filtered)">
<title>Without DataSet</title>
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
text-align:right;
direction:rtl;
unicode-bidi:embed;
font-size:12.0pt;
font-family:"Times New Roman";}
p.doctext, li.doctext, div.doctext
{margin-right:0cm;
margin-left:0cm;
font-size:12.0pt;
font-family:"Times New Roman";}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 89.85pt 72.0pt 89.85pt;}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body lang=EN-US>
<div class=Section1 dir=RTL>
<div align=left dir=ltr>
<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0>
<thead>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'><b>Without DataSet</b></p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'><b>With DataSet</b></p>
</td>
</tr>
</thead>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>You must supply all SQL statements, in the format expected by the
provider. This is true for all SELECT, INSERT, UPDATE, and DELETE requests.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>The DataSet and DataAdapter work together to craft many of the SQL
statements on your behalf.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Data retrieved through the DataReader is read-only. You must issue
separate commands to update data.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Data read from the database can be modified in-memory, and updated as
a batch with a single method call.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Data transfers are very efficient, because there is no overhead needed
to move data into a complex DataSet structure.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>There may be a performance hit as the DataSet builds the necessary
objects required for each transferred record.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Memory allocation is limited to a single record's worth of data
fields, plus some minimal overhead.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Memory allocation is required for the entire result set, plus overhead
for every table, field, column, and row in the result set.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Only a single DataReader can be open at a time (unless the provider
supports MARS, which I'll discuss in just a bit).</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Any number of DataSets can be in use at once.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>A live connection to the database exists as long as a DataReader is in
use. If it takes you five minutes to scan a result set because you are doing
a lot of per-record analysis, the connection will be active for the full five
minutes.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Data connections are maintained only long enough to transfer data from
or to the database.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>DataReaders present one record at a time. The records must be
processed in the order they arrive.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>You can jump around the records in a DataSet, and reorganize them to
meet your needs.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>You spend a lot of time working with Strings (for SQL statements) and
raw data fields.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>All data fields are organized logically, just like they are in the
actual database. You can interact with them directly.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Each Command and Connection works with a single provider-supported
data source.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Different DataTables within your DataSet can connect to distinct data
sources. Also, you can hand-craft data so that each DataRow contains data
from different sources.</p>
</td>
</tr>
<tr>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Because you manage all SQL statements, you have a (relatively) high
level of control over the entire data interaction process.</p>
</td>
<td valign=top style='padding:3.75pt 3.75pt 3.75pt 3.75pt'>
<p class=MsoNormal dir=LTR style='text-align:left;direction:ltr;unicode-bidi:
embed'>Because the view of the data is abstracted, you have a (relatively)
limited level of control over the entire data interaction process (although
advanced use of DataSets does give you some additional control).</p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal dir=RTL><span dir=LTR>&nbsp;</span></p>
</div>
</body>
</html>

rezaei manesh
یک شنبه 24 دی 1385, 08:33 صبح
خوب اگه در همه فرم ها(20) بجز یکی دو تا باید به بانک وصل بشیم و اطلاعات را از اون بخونیم آیا بازم باید کانکشن رو ببندیم نظر من که روی اون پافشاری هم دارم اینه که نبندم چون من علاوه بر نمایش این اطلاعات در 90 درصد اونها اعمال تغییرات رو هم دارم .(البته در برنامه های وب حتما همیشه بعد هر کاری کانکشن رو می بندم و 99 درصد از دیتا ریدر استفاده می کنم)این از بستن کانکشن.
اما در این مورد من یک نمه شک دارم :
فرض کنید یک فرم داریم که باید حدود 100 تا رکورد یا در فرمی دیگر بیش از 1000 تا رکورد رو در یک گراید ویو بریزیم . این فرم فقط برای نمایش هست .اما چند دکمه هم هست که اضافه و ویرایش و حذف داره که با زدن دو تای اولی یک فرم دیگه باز می شه و کارهای مربوطه اونجا اعمال می شه آیا در اینجا باید گراید رو با دیتاریدر پرکنیم و برای اعمال تغییرات مستقیم با بانک کارکنیم و در انتهای هر کار دوباره کل اطلاعات را وارد گراید کنیم ؟
یا اینکه نه بهتر هست (روش من) که جدول رو با دیتا ست پرکنیم و تعیرات رو در دیتا ست اعمال کنیم و از طریق دیتاست تغییرات رو به بانک اعمال کنیم و در نتیجه خودبخود تغییرات در گراید هم اعمال میشه و در دفعات بعدی خیلی سریعتر عمل می کنه، خوب اما اشغال منابع سیستم رو هم داریم دیگه .

leG_big
یک شنبه 24 دی 1385, 21:04 عصر
سلام دوستان ، از این همه لطف شما ممنونم که در این نظر سنجی ما شرکت کردید و همچنین از شما آقا حامد ، از شما هم ممنونم که بحث رو پیگری میکنید . و منظور رو به دوستان رسوندید .

نتیجه ای که من از این صحبت ها گرفتم + نظر خودم : از دیتاست استفاده کنیم
و اینکه به نظر من برای سرعت بهتره اول برنامه یه LOADING بزاریم که قبل از بالا اومدن برنامه کله دیتاست ها پر بشه (اونایی که مهمه و در ارجئیت هست اول پر بشه)


شما هم نظر بدین دوستان . مرسی از همکاریتون

ali_kolahdoozan
یک شنبه 24 دی 1385, 21:18 عصر
دیتاست رو نیستم . loading ‌رو هم نیستم توی یک برنامه خیلی بزرگ طرف مثلا میاد با 2 فرم داستانش تموم میشه برنامه رو میبنده میره پی کارش . شما میخواهی چند تا دیتا (حالا هر چی) load کنی بی انصاف

meh_secure
دوشنبه 25 دی 1385, 00:37 صبح
می دونید اگه دیتاست رو همان اول برنامه پر کنیم چه فاجعه هایی رخ خواهند داد؟ بهتره که بسته به نیاز کار انجام بشه. حالا ممکنه برای پر شدن یه دیتاست کاربر 2 ثانیه هم انتظار بکشه که عمرا این زمان ها به چشمش هم نمیاد. اما اگه وسط کار برنامه به علت کمبود حافظه از بین بره چی؟؟!!

rezaei manesh
دوشنبه 25 دی 1385, 08:18 صبح
آقا میثم خواهش،وظیفه هست .
من هم به شدت با پر شدن دیتا ست همون اول برنامه مخالف هستم چون اصلان معلوم نیست که حتما از اون استفاده بشه یا نه و اینکه برای بعضی از اونا رو ما مجبوریم از کاربر یک فیلتری رو بگیریم و ووو...
اما دوستمون آقای کلاه دورزان یه جایی گفتند از دیتا ویو استفاده می کنند و اون قابلیت های دیتا ست رو داره اما من گفتم که خوب دیتا ویو رو با چی پر می کنند ایشان فرمودند با آداپتور .خوب حالا مگه می شه با اداپتور بدون دیتا ست جدولی رو پر کرد؟!
نتیجه من تا اینجا این بود که من همون روال سابق خودم رو برم اما در وب باز هم جدی تر از دیتا ریدر استفاده کنم
و یه سوال اینکه دوستانی که اطلاعات فیلتر شده اما زیادی رو از یک جدول بزرگ می گیرند و نمایش می دهند (در گراید) و اعمال تغییرات رو هم دارند از چه روش استفاده می کنند؟دیتاست و یا دیتاریدر ؟ اگر می شه چکونگی کار با اون رو هم با کد بگن .همون طور که می دونید روش های مختلفی برای پر کردن وجود داره ؟شاید خود دیتا ست خوب باشه اما روش استفاده از اون صحیح نباشه !روش صحیح رو اگه بگید هم خیلی خوبه
روش من اینه که اغلب اطلاعات رو با استفاده از پروسیجر ها به صورت فیلتر شده می گیرم و در دیتاست قرار می دهم منتظر روش های دیگر دوستان هم هستم؟

ali_kolahdoozan
دوشنبه 25 دی 1385, 08:51 صبح
بله میشه . یک کتاب ado.net‌ مطالعه کنید ببینید میشه . شما بدون دیتاست میتونید دیتا ویو داشته باشید .

rezaei manesh
دوشنبه 25 دی 1385, 09:23 صبح
حق با شماست می شه بدون دیتاست یک Table و در نتیجه یک dataview رو پر کرد .
اینم یک سایت که در مورد استفاده از دیتا ست یکمی توضیح داده
http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson05.aspx
اما من هنوز تصمیم به استفاده از دیتاست دارم مگر در جاهای خاص که فقط می خوام اطلاعات فیلتر شده رو از بانک بخونم.
اما پرکردن دیتاویو بدون دیتاست هم جالب بود برام.

ali_kolahdoozan
دوشنبه 25 دی 1385, 11:31 صبح
باز اگر msdn بخونید میبینید خود dataset داره از datatable استفاده میکنه . و دیتاست در اصل یک پوستس . اما به هر حال dataset هم یک برای خودش مزیتهایی داره . اما برای رکورد بالا فاجعه است من تست کردم . منظورم از رکورد بالا 1000 تا نیستها . من پروژه ای داشتم که رکوردهای یک جدولش در عرض 1 ماه شده بود 400000 . اونوقت میبینید dataset چقدر کند میشه . توی وب هم پیشنهاد میکنم اصلا استفاده نشه

rezaei manesh
دوشنبه 25 دی 1385, 19:29 عصر
خوب پس یک کاری می کنیم هر جا که قرار شد و بیش از 2000تا رکورد رو همزمان نمایش بدم از datareader استفاده می کنم اما فکر کنم خیلی به ندرت پیش بیاد چون من تا به حال نشده 2هزارتا رکرود رو همزمان نمایش بدم حتمان یک فیلتر قبلش می زارم چون اطمینان دارم کاربر در آن واحد با 2هزارتا رکورد کار نداره که داره؟! اما با شما هم موافقم که سرعت دیتارید خوبه

ali_kolahdoozan
دوشنبه 25 دی 1385, 20:07 عصر
چرا یه موقع میخواهی گزارش بگیری و اتفاقی تعداد رکوردهای این گزارش زیاده یا جاهایی که جدولها msater و detail هستن . مثلا 2000 تا رکورد توی مستر هست مثلا فاکتور و هر فاکتور توی detail مثلا 10 تا رکورد داره . اینجا رو چی میگی؟

sh
دوشنبه 25 دی 1385, 23:17 عصر
یبار قبلا گفتم اگر بانک اطلاعاتی شما SqlServer هست از متد زیر استفاده کنید
Executing Commands Asynchronously

قبلا هم آقای بخشایش یه مثال تو همین قسمت گذاشتند و سرعت لود اطلاعات 10 برابر بیشتر از دیتاردر هست اینو تو دیتابیسهای با حجم بالا تست کنید و ببینید

Sub Zero
دوشنبه 25 دی 1385, 23:53 عصر
یبار قبلا گفتم اگر بانک اطلاعاتی شما SqlServer هست از متد زیر استفاده کنید
Executing Commands Asynchronously

قبلا هم آقای بخشایش یه مثال تو همین قسمت گذاشتند و سرعت لود اطلاعات 10 برابر بیشتر از دیتاردر هست اینو تو دیتابیسهای با حجم بالا تست کنید و ببینید


اگه ممکنه این پست رو یه بار دیگه و به صورت مرتب بفرستید تا استفاده کنیم .

ali_kolahdoozan
سه شنبه 26 دی 1385, 06:43 صبح
من که چیزی از این کدها سر در نیاوردم . اما کلا datareader ابزاری نیست که راحت بشه همیشه ازش استفاده کرد . همون dataview ترجیح داره

meh_secure
سه شنبه 26 دی 1385, 15:53 عصر
حرف شما درست اما استفاده از Dataset زمانی جلوه ی واقعی خودش رو نشان می ده که از رابطه ی بین جداول در اون استفاده بشه. عرض کردم که , هر ابزاری برای کار خاصی تهیه شده. اگر قرار در یک Dataset فقط یک جدول ریخته بشه , خب این چه کاریه؟ چرا از Datatable استفاده نکنیم؟؟!

rezaei manesh
سه شنبه 26 دی 1385, 17:32 عصر
آقا من راجع به Querying Large Result Sets Asynchronously تحقیق کردم که شرایط خاصی هم داره این روش کار رو در چند مرحله انجام می ده و در هر مرحله اطلاعات رو نشون می ده که برای رکورد های خیلی بالا بهترین روش هست
من اینو با 2 میلیون و 250 هزار رکورد تست کردم یکمی با اذیت لود شد اما با دیتا ست اصلا هنگ کرد
البته برای استفاده از این روش باید کانکشن رو به این صورت باز کرد Asynchronous Processing=True که توصیه می اگه از این روش استفاده نمی شه این طوری باز نشه
اما رابطه ی بین جداول در دیتا ست من زیاد از این روش استفاده نمی کنم باهاش راحت نیستم خیلی اذیت می کنه شاید هم مشکل از منه

leG_big
چهارشنبه 27 دی 1385, 20:34 عصر
آقا من راجع به Querying Large Result Sets Asynchronously تحقیق کردم که شرایط خاصی هم داره این روش کار رو در چند مرحله انجام می ده و در هر مرحله اطلاعات رو نشون می ده که برای رکورد های خیلی بالا بهترین روش هست
من اینو با 2 میلیون و 250 هزار رکورد تست کردم یکمی با اذیت لود شد اما با دیتا ست اصلا هنگ کرد
البته برای استفاده از این روش باید کانکشن رو به این صورت باز کرد Asynchronous Processing=True که توصیه می اگه از این روش استفاده نمی شه این طوری باز نشه
اما رابطه ی بین جداول در دیتا ست من زیاد از این روش استفاده نمی کنم باهاش راحت نیستم خیلی اذیت می کنه شاید هم مشکل از منه


سلام دوستان ، از اینکه مارو یاری کردید واقعا ممنون هستم . در ضمن من نگفتم که کله دیتاست ها رو باهم لود کنیم ، گفتن که اونایی رو که اول کار نیاز هست .
در ضمن اصلا من با دیتاست مخالف هستم (در رکورد بالا) و ترجیح میدم ریسک کمتری بکنم و کد بیشتری بنویسم تا کاربر من با مشکل مواجه نشه در زمان استفاده . در ضمن شما مثلا چندتا عملیات رو میخواهید از دیتاست استفاده مکنید تا راحت باشید . ؟! من خودم برای آپدیت و ... یک کلاس نوشتم که کارم رو خیلی راحت کرده و فقط یک کوئری ارسال می کنم و جواب می گیرم و اصلا مشکلی هم ندارم در ضمن سرعتش هم خیلی بالا هست.
به نظر من ارتباط مستقیم تا غیر مستفیم خیلی سرعتش بالاتر هست . من در مهر امسال تو شرکت اکتشاف نفت تهران یک پروژه داشتم که برای حا مشکلم از مهندس برنامه نویسی اونجا کمک گرفتم و اونا به من ارتباط مستقیم رو پیشنهاد کردن و من هم از تجربه اونها دارم استفاده می کنم و تا حالا دچار مشکل نشدم . کارم سخت تر شده و لی کاربرهام راضی هستن از نرم افزارهام .

چون در ارتباط غیر مستقیم ، اطلاعات باید اول بیاد در حافظه سیستم بارگزاری بشه و بعد دوباره نمایش داده بشه .
ولی در اتباط مستقیم به صورت مستقیم اطلاعات نمایش داده میشه و اصلا حافظه در گیر نمیشه در حد دیتاست .


در ضمن آقا حامد میتونی اون راه حلی رو که تحقیق کردی رو بگی تا من و دوستان هم یاد بگریم ؟!!!


بازم مرسی از همه شما دوستان که این تاپیک رو فعال کردید .


در ضمن

rezaei manesh
پنج شنبه 28 دی 1385, 08:03 صبح
من این دو نمونه رو تست کردم


Public Sub read()


Dim cnn As New s.SqlConnection
cnn.ConnectionString = My.Settings.myConnectionString '"Data Source=(local).;Initial Catalog=your Catalog" & _
'";Integrated Security=True;Asynchronous Processing=True" 'this last part "Asynchronous Processing=True" is very imporatnt

Dim testcommand As New s.SqlCommand("select * from tblUsers", cnn) 'write your sql code here
testcommand.CommandType = CommandType.Text
cnn.Open()
Dim callback As AsyncCallback = New AsyncCallback(AddressOf DataReaderIsReady)
Dim asyncresult As IAsyncResult = testcommand.BeginExecuteReader(callback, testcommand)
End Sub

Private Sub DataReaderIsReady(ByVal result As IAsyncResult)
MessageBox.Show("Results Load Complete", "I'm Done")
Dim testCommand As s.SqlCommand = CType(result.AsyncState, s.SqlCommand)
Dim sqlDr As s.SqlDataReader = testCommand.EndExecuteReader(result)
If sqlDr.HasRows Then
For Each rec As DbDataRecord In sqlDr
dbRecordsHolder.Add(rec)
Next
End If
sqlDr.Close()
testCommand.Connection.Dispose() 'Do not forget to at least close, if not dispose
End Sub

Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.dg.DataSource = dbRecordsHolder
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call read()
End Sub

و همچنین اینو :


''''Hamed Rezaei 85/10/28
Public Class Form2

' Add this code to the form's class:
' You need this delegate in order to fill the grid from
' a thread other than the form's thread. See the HandleCallback
' procedure for more information.
Private Delegate Sub FillGridDelegate(ByVal reader As SqlDataReader)

' You need this delegate to update the status bar.
Private Delegate Sub DisplayStatusDelegate(ByVal Text As String)

' This flag ensures that the user does not attempt
' to restart the command or close the form while the
' asynchronous command is executing.
Private isExecuting As Boolean

' Because the overloaded version of BeginExecuteReader
' demonstrated here does not allow you to have the connection
' closed automatically, this example maintains the
' connection object externally, so that it is available for closing.
Private connection As SqlConnection


Private Sub DisplayStatus(ByVal Text As String)
Me.Label1.Text = Text
End Sub

Private Sub FillGrid(ByVal reader As SqlDataReader)
Try
Dim table As New DataTable
table.Load(reader)
Me.DataGridView1.DataSource = table
DisplayStatus("Ready")

Catch ex As Exception
' Because you are guaranteed this procedure
' is running from within the form's thread,
' it can directly interact with members of the form.
DisplayStatus(String.Format("Ready (last attempt failed: {0})", ex.Message))
Finally
' Do not forget to close the connection, as well.
If Not reader Is Nothing Then
reader.Close()
End If
If Not connection Is Nothing Then
connection.Close()
End If
End Try
End Sub

Private Sub HandleCallback(ByVal result As IAsyncResult)
Try
' Retrieve the original command object, passed
' to this procedure in the AsyncState property
' of the IAsyncResult parameter.
Dim command As SqlCommand = CType(result.AsyncState, SqlCommand)
Dim reader As SqlDataReader = command.EndExecuteReader(result)

' You may not interact with the form and its contents
' from a different thread, and this callback procedure
' is all but guaranteed to be running from a different thread
' than the form. Therefore you cannot simply call code that
' fills the grid, like this:
' FillGrid(reader)

' Instead, you must call the procedure from the form's thread.
' One simple way to accomplish this is to call the Invoke
' method of the form, which calls the delegate you supply
' from the form's thread.
Dim del As New FillGridDelegate(AddressOf FillGrid)
Me.Invoke(del, reader)
' Do not close the reader here, because it is being used in
' a separate thread. Instead, have the procedure you have
' called close the reader once it is done with it.

Catch ex As Exception
' Because you are now running code in a separate thread,
' if you do not handle the exception here, none of your other
' code catches the exception. Because there is none of
' your code on the call stack in this thread, there is nothing
' higher up the stack to catch the exception if you do not
' handle it here. You can either log the exception or
' invoke a delegate (as in the non-error case in this
' example) to display the error on the form. In no case
' can you simply display the error without executing a delegate
' as in the Try block here.

' You can create the delegate instance as you
' invoke it, like this:
Me.Invoke(New DisplayStatusDelegate(AddressOf DisplayStatus), _
"Error: " & ex.Message)
Finally
isExecuting = False
End Try
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If isExecuting Then
MessageBox.Show(Me, "Already executing. Please wait until the current query " & _
"has completed.")
Else
Dim command As SqlCommand
Try

DisplayStatus("Connecting...")
connection = New SqlConnection(My.Settings.myConnectionString)

' To emulate a long-running query, wait for
' a few seconds before retrieving the real data.VWorkGrp2Fld
command = New SqlCommand("select * from tblUsers", connection)
connection.Open()

DisplayStatus("Executing...")
isExecuting = True
' Although it is not required that you pass the
' SqlCommand object as the second parameter in the
' BeginExecuteReader call, doing so makes it easier
' to call EndExecuteReader in the callback procedure.
Dim callback As New AsyncCallback(AddressOf HandleCallback)
command.BeginExecuteReader(callback, command)

Catch ex As Exception
DisplayStatus("Error: " & ex.Message)
If connection IsNot Nothing Then
connection.Close()
End If
End Try
End If
End Sub

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If isExecuting Then
MessageBox.Show(Me, "Cannot close the form until " & _
"the pending asynchronous command has completed. Please wait...")
e.Cancel = True
End If
End Sub
End Class

تو msdn هم بازم هست
اما سرعت لود خوبه اما من به شخصه تا مجبور نشم از این روش استفاده نمی کنم چون اذیت می کنه

sinpin
پنج شنبه 28 دی 1385, 09:29 صبح
یبار قبلا گفتم اگر بانک اطلاعاتی شما SqlServer هست از متد زیر استفاده کنید
Executing Commands Asynchronously

قبلا هم آقای بخشایش یه مثال تو همین قسمت گذاشتند و سرعت لود اطلاعات 10 برابر بیشتر از دیتاردر هست اینو تو دیتابیسهای با حجم بالا تست کنید و ببینید


بعید میدونم سریعتر لود بشه (و حتی باید کندتر هم بشه)
مزیت اینه که عمل لودینگ رو در یک thread مجزا انجام میده که حالت پایدارتری ایجاد میکنه و برای کاربر نهایی خوشایند تر خواهد بود (چون برنامه موقع لود دیتا not respond نمیشه)

rezaei manesh
پنج شنبه 28 دی 1385, 12:43 عصر
آقا بیان یک نتیجه گیری بکنیم
من کلا دچار چندگانگی شدم
فرض کنید یک جدول داریم که حدود 1000 رکورد داره که شامل 70 فیلد هست و خیلی هم از اون استفاده میشه
حالا باید اول اطلاعات در یک گرید نشون داده بشه با 2 فیلد بعد برای اضافه شدن و تغییر باید یک فیلد اون تغییر کنه و برای بقیه فیلد ها هم یه دکمه دیگه وجود داره که که با زدن اون همه فیلد های این رکورد باید تغییر کنه بجز اون فیلدی که در گرید نمایش داده می شد . حالا بهترین روش برای این کار چیه من قبلا می خواستم اینو با دیتاست بنویسم اما الان دچار تردید شدم.
حالا می خوام از روش آقای کلاهدوزان استفاده کنم از دیتاآداپتور و table آیا بهترین روش برای این مورد هست در ضمن من می خوام یه طوری بشه که مجبور نشم با هر تغییر کوچک کل بانک رو دوباره بریزم تو گرید .
خوب کدوم بهتره؟؟؟؟؟؟؟؟

rezaei manesh
پنج شنبه 28 دی 1385, 13:38 عصر
من الان دوباره با 10000 تا رکورد روش خودم (دیتا ست )رو چک کردم در عرض یک ثانیه گرید رو پر کرد
پس از همین روش استفاده می کنم روش خودم در این مورد فکر کنم بهتره، من هم باهاش راحت ترم
اما خیلی این تغییر روش ها و تست همه اینها وقتم رو گرفت اما خیلی چیزا رو هم یاد گرفتم
با تشکر
اما نتیجه من در اینجا اینه که برای زیر 200هزارتا از همین دیتاست استفاده کنیم برای زیر یک میلیون از دیتا ریدر و برای بالای میلیون از روش Executing Commands Asynchronously
با تشکر

ali_kolahdoozan
پنج شنبه 28 دی 1385, 13:47 عصر
هر جور راحتی عمل کن . برای برنامه های شما که کوچیک است فرقی نداره

linux
پنج شنبه 28 دی 1385, 21:06 عصر
لود کردن 2 میلیون رکورد در یک دیتا بیس مثل این می ماند که بخواهید همه بایگانی را یکجا ببرید به اتاق رئیستان!
کاربر با 2 میلیون تا رکورد می خواهد چی کار کنه؟! در طراحی برنامه تا کاملا تجدید نظر کنید

leG_big
جمعه 29 دی 1385, 15:57 عصر
لود کردن 2 میلیون رکورد در یک دیتا بیس مثل این می ماند که بخواهید همه بایگانی را یکجا ببرید به اتاق رئیستان!
کاربر با 2 میلیون تا رکورد می خواهد چی کار کنه؟! در طراحی برنامه تا کاملا تجدید نظر کنید

سلام دوستان ، از همه شما ممنون هستم . که اینقدر این بحث رو پیگیری کردید . امید وارم بتونم براتون جبران کنم . من یک تحقیق کوچیک هم کردم (از استادهای دانشگاه پرسیدم) و این اقایون بیشتر دیلیل اینکه سرعت بارگزاری اطلاعات در دیتابیس و نرم افزار میاد پایین این هست که دیتابیس رو Normal سازی نکردیم ؟!!!!!

حالا آقا حامد شما نرمال سازی کردید دیتابیس رو ؟!!! یعنی اینکه فیلدهای تون رو تو جدول ها پخش کردید ؟!!!!!

rezaei manesh
شنبه 30 دی 1385, 12:52 عصر
بله من که گفتم 2 میلیون رکورد برای تست بود که بدونم برای هر اندازه رکورد باید از کدوم روش استفاده کنم من همون طور که بارها گفتم هیچ موقع نمیام 2 میلیون رکورد رو با هم نشون بدم حتی 1000 تا شم باهم نشون نمی دم با توجه به شرایط اینو فیلتر میکنم .
اما اینکه تعداد فیلدهای من 70 تا هست رو این در بهترین وضعیت هست که 3 چهار تا از این فیلد ها خودشون یک ID هستند (که جدول مربوطه خودش دارای چندین فیلد هستند )که به دیگر جداول متصل هستند این بهترین وضعیت نرمال سازی هست دیگه از این بهتر نمی شد (البته از نظر من)
در ضمن استادتون هم راست گفته اما در اینجا صادق نیست