PDA

View Full Version : حرفه ای: راهکار برای بالا رفتن سرعت در ثبت هفتاد هزار رکورد در datagridview



sagggad
سه شنبه 08 بهمن 1392, 07:53 صبح
سلام دوستان
من برای ساخت یک برنامه سنگین باید در فرم لود برنامه هفتاد هزار رکورد رو از بانک اطلاعاتیم بخونم و در یک دیتاگریدویو نمایش بدم
اما این کار باعث شده که برنامه وقتی میخواد اجرا بشه 13 ثانیه طول میکشه تا اطلاعات لود بشه
من قبل از این اطلاعات رو در لیست باکس نشون میدادم وبا استفاده از دو متد () BeginUpdate و () EndUpdate سرعت ثبت این تعداد رکورد در لیست باکس بسیار بالا رفته بود (3 ثانیه)
حالا میخواستم ببینم آیا راهی هست که برای گریدویو هم یه همچین کاری کردو سرعت رو بالا برد؟؟
این کدهایی هست که من در FormLoad نوشتم:


public ArrayList lst1 = new ArrayList();
public ArrayList lst2 = new ArrayList();
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=|DataDirectory|\\Words.mdb;user id=; password=;";
OleDbCommand command = new OleDbCommand();
con.Open();
command.Connection = con;
command.CommandText = "select * from fatoen";
OleDbDataReader readre = command.ExecuteReader;
if (readre.HasRows == true) {
for (i = 0; i <= 71295; i++) {
if (readre.Read) {
lst2.Add(readre.GetString(0));
lst1.Add(readre.GetString(1));
DataGridView1.Rows.Add(1);
DataGridView1.Rows(i).Cells(0).Value = readre.GetString(1);
DataGridView1.Rows(i).Cells(1).Value = readre.GetString(0);
}
}
}
con.Close();
اساتید راهنمایی کنید لطفا...:بوس:

NasimBamdad
سه شنبه 08 بهمن 1392, 08:17 صبح
کار کاملا اشتباهی هست که هفتاد هزار رکورد رو لود کنی . هیچ انسانی نمی تونه در یک لحظه اون رو بخونه و ازش استفاده کنه . پس چرا برای چیزی که استفاده نمی شه هزینه کنه ؟

1- از Paging استفاده کنید . مثلا هر 100 رکورد یا کم و بیشتر را نشان دهد
2- از Stored Procedure استفاده کنید
3- از Thread استفاده کنید

sagggad
سه شنبه 08 بهمن 1392, 08:20 صبح
بله درست میگید
اما مشکل من همینجاست که چه طور این ها رو لود کنم؟؟
چون برنامه یک برنامه دیکشنری هست و کاربر در هر لحظه ممکنه در جعبه متن یکی از این کلمات رو سرچ کنه و باید در گریدویو وجود داشته باشه
حالا چه راه حلی به ذهنتون میرسه؟

hamid_hr
سه شنبه 08 بهمن 1392, 08:41 صبح
بریز داخل یه datatable بعد dgv.datasoure = dt;‌رو بزن
سرعت میره بالا

Boy_nn
سه شنبه 08 بهمن 1392, 08:42 صبح
لازم نیست که کل اطلاعات یه دفعه لود بشه
وقتی یه کلمه رو زد برو خط مربوط به همون کلمه رو بخون و نشونش بده
شاید دیکشنری و یا برنامه ات روزی به جایی برسه که تعداد n رکورد داشته باشی اگه بخوای لود کنی هم رموتو اشغال می کنی هم برنامه ات بیش از حد دیر لو میشه
چرا از Ado استفاده می کنی برو سراغ entity به نظر من که خیلی بهتره

sagggad
سه شنبه 08 بهمن 1392, 08:50 صبح
دوستان ممنون
اما مشکل من همینه که روش بالا بردن سرعت رو نمیدونم

وقتی یه کلمه رو زد برو خط مربوط به همون کلمه رو بخون و نشونش بده
چه طور این کار رو انجام بدم؟؟
خوب برنامه برای این کار احتیاج به جستجو داره
کجا جستجو کنه؟؟
باید در یک جا این اطلاعات لود بشه یا نه؟؟؟

NasimBamdad
سه شنبه 08 بهمن 1392, 09:35 صبح
دوستان ممنون
اما مشکل من همینه که روش بالا بردن سرعت رو نمیدونم
چه طور این کار رو انجام بدم؟؟
خوب برنامه برای این کار احتیاج به جستجو داره
کجا جستجو کنه؟؟
باید در یک جا این اطلاعات لود بشه یا نه؟؟؟


ساختار برنامه ات رو نمی دونیم ، یه نمونه از اتصال به دیتابیس و این گرید بذار ببینیم چیه .

چرا از گرید استفاده کنی ؟ شما یک TextBox لازم داری که معادل مثلا فارسی اش رو ببینه طرف

پس شما باید مقدار TextBox رو از دیتابیست سرچ کنی ، و خروجی رو مثلا در گرید یا Lable و ... نشون بدی .


نکنه شما میای همه رو توی گرید نشون می دی و از گرید فیلتر می کنی ؟

hamid_hr
سه شنبه 08 بهمن 1392, 09:39 صبح
DataTable dt = new DataTable();
dt.Load(readre);
dgv.datasource = dt;

fmehrvarzi
سه شنبه 08 بهمن 1392, 09:42 صبح
بله درست میگید
اما مشکل من همینجاست که چه طور این ها رو لود کنم؟؟
چون برنامه یک برنامه دیکشنری هست و کاربر در هر لحظه ممکنه در جعبه متن یکی از این کلمات رو سرچ کنه و باید در گریدویو وجود داشته باشه
حالا چه راه حلی به ذهنتون میرسه؟

چون برنامه ات یک دیکشنری هست، از دیتاگریدویو استفاده نکن!
بیا از لیست باکس یا لیست ویو استفاده کن و همون دستورات BeginUpdate و EndUpdate استفاده کنی این هم نمونه یک دیکشنری

http://www.italiasw.com/files/uploads/2008/04/lingoes-22-03.jpg

sagggad
سه شنبه 08 بهمن 1392, 09:53 صبح
بله نظر خودم هم استفاده از لیست باکس هست
اما میخوام ببینم تو گرید چه طوری میشه؟

sagggad
سه شنبه 08 بهمن 1392, 09:55 صبح
ساختار برنامه ات رو نمی دونیم ، یه نمونه از اتصال به دیتابیس و این گرید بذار ببینیم چیه .

چرا از گرید استفاده کنی ؟ شما یک TextBox لازم داری که معادل مثلا فارسی اش رو ببینه طرف

پس شما باید مقدار TextBox رو از دیتابیست سرچ کنی ، و خروجی رو مثلا در گرید یا Lable و ... نشون بدی .


نکنه شما میای همه رو توی گرید نشون می دی و از گرید فیلتر می کنی ؟

آره من دقیقا میخوام همینکار رو بکنم

NasimBamdad
سه شنبه 08 بهمن 1392, 09:57 صبح
نکنه شما میای همه رو توی گرید نشون می دی و از گرید فیلتر می کنی ؟

یعنی در Form_Load میای دیتابیست رو لود می کنی ، بعد که کاربر میاد توی TextBox کلمه ای رو می نویسه دیتاگرید رو فیلتر می کنی

اره ؟

sagggad
سه شنبه 08 بهمن 1392, 10:20 صبح
نکنه شما میای همه رو توی گرید نشون می دی و از گرید فیلتر می کنی ؟

یعنی در Form_Load میای دیتابیست رو لود می کنی ، بعد که کاربر میاد توی TextBox کلمه ای رو می نویسه دیتاگرید رو فیلتر می کنی

اره ؟
بله دقیقا دوست من

sagggad
سه شنبه 08 بهمن 1392, 10:22 صبح
DataTable dt = new DataTable();
dt.Load(readre);
dgv.datasource = dt;

آفرین به دوست عزیزم hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr) ...
مشکل حل شد
خیلی خیلی از همه به خصوص حمید جان ممنونم

Boy_nn
سه شنبه 08 بهمن 1392, 10:24 صبح
سلام
یه پیشنهاد دارم فلن برنامه تو ول کن برو سراغ linq و entity
شما اطلاعاتت تو برنامه نویسی کمه اول برو اطلاعاتت رو کامل کن List رو یاد بگیر بعد منظور منو از اون حرفی که زدم رو متوجه میشی
بهتره بیشتر از این که فکر نوشتن برنامه باشی فکر افزایش اطلاعاتت باشی مخصوصا شما که سنتم خیلی کمه

sagggad
سه شنبه 08 بهمن 1392, 10:26 صبح
سلام
یه پیشنهاد دارم فلن برنامه تو ول کن برو سراغ linq و entity
شما اطلاعاتت تو برنامه نویسی کمه اول برو اطلاعاتت رو کامل کن List رو یاد بگیر بعد منظور منو از اون حرفی که زدم رو متوجه میشی
بهتره بیشتر از این که فکر نوشتن برنامه باشی فکر افزایش اطلاعاتت باشی مخصوصا شما که سنتم خیلی کمه
نه دوست عزیز
الان شما دقت کن:
همه دارن از ADO.NET استفاده میکنن و مشکلی هم ندارن
من هم در حدی که لازم بود یاد داشتم و الان با کاری که حمید آقا گفتن مشکلم حل شد
ممنون

Boy_nn
سه شنبه 08 بهمن 1392, 10:31 صبح
کسی که از ado استفاده می کنه از برنامه نویسی روز چند سال عقب هست (مگه برای مواد خاص)
با شتر میشه مسافرت کرد شاید خیلی ها هم برای مسافرت ازش استفاده کنن ولی ....
فقط فکر حل کردن مشکل نباش فکر یادگیری مطالب جدید باش
خیلی خوبه که از این سن شروع کردی به برنامه نویسی ولی حیفه اگه با جدید ترین متد های روز آشنا نشی
در ضمن درسته که کارت با ado راه میفته ولی فکر می کنی ماکروسافت میاد یه تکنولوژی جدید میده بیرون بدون هیچ تفاوتی با نسل قبل مطمئن باش وقتی با تلنولوژی ها روز آشنا بشی می فهمی که چقدر به روز بودن خوبه

NasimBamdad
سه شنبه 08 بهمن 1392, 10:35 صبح
کسی که از ado استفاده می کنه از برنامه نویسی روز چند سال عقب هست (مگه برای مواد خاص)
با شتر میشه مسافرت کرد شاید خیلی ها هم برای مسافرت ازش استفاده کنن ولی ....
فقط فکر حل کردن مشکل نباش فکر یادگیری مطالب جدید باش
خیلی خوبه که از این سن شروع کردی به برنامه نویسی ولی حیفه اگه با جدید ترین متد های روز آشنا نشی


آفرین ، استفاده از دیتای سنگین مخصوصا در این حد برای ADO مناسب نیست !

sagggad
سه شنبه 08 بهمن 1392, 10:38 صبح
کسی که از ado استفاده می کنه از برنامه نویسی روز چند سال عقب هست (مگه برای مواد خاص)
با شتر میشه مسافرت کرد شاید خیلی ها هم برای مسافرت ازش استفاده کنن ولی ....
فقط فکر حل کردن مشکل نباش فکر یادگیری مطالب جدید باش
خیلی خوبه که از این سن شروع کردی به برنامه نویسی ولی حیفه اگه با جدید ترین متد های روز آشنا نشی
در ضمن درسته که کارت با ado راه میفته ولی فکر می کنی ماکروسافت میاد یه تکنولوژی جدید میده بیرون بدون هیچ تفاوتی با نسل قبل مطمئن باش وقتی با تلنولوژی ها روز آشنا بشی می فهمی که چقدر به روز بودن خوبه
ممنون از راهنماییت
اما چون من زیاد وقت ندارم سراغ چیزهای دیگه نمیرم وگرنه که طبیعیه هر چی جدیدتر بهتر...

sagggad
سه شنبه 08 بهمن 1392, 10:39 صبح
دوستان اینجا هم راهنمایی کنید لطفا:
http://barnamenevis.org/showthread.php?438722-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D8%AF%D8%B1-%DB%8C%DA%A9-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%AE%DB%8C%D9%84%DB%8C-%D9%86%DA%AF%DB%8C%D9%86-%D8%A7%D8%B2-%D9%86%D9%88%D8%B9-String

Boy_nn
سه شنبه 08 بهمن 1392, 10:45 صبح
دوستان اینجا هم راهنمایی کنید لطفا:
http://barnamenevis.org/showthread.php?438722-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D8%A8%D9%87%DB%8C%D9%86%D9%87-%D8%AF%D8%B1-%DB%8C%DA%A9-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%AE%DB%8C%D9%84%DB%8C-%D9%86%DA%AF%DB%8C%D9%86-%D8%A7%D8%B2-%D9%86%D9%88%D8%B9-String

به نظر من سعی کن بیشتر وقتتو بزاری برای تحقیق


جواب سوالی هم که پرسیدی همون جواب قبلی هست برو سراغ linq
اینم یه مثال
var listF= list.Where(x => x.Name.Contains("متغیر"));