PDA

View Full Version : برنامه ام خیلی کند عمل می کند



alih988
شنبه 27 بهمن 1386, 00:08 صبح
به نام خدا
سلام خدمت شما ، راستش این اولین بار هستش که تصمیم گرفتم به صورت جدی یک برنامه بنویسم ، و در همین راستا به مشکلات خیلی زیادی برخوردم!

یک برنامه کتابخانه شخصی دارم می نویسم ، که از بانک اکسس اتسفاده می کنه

طرفی که برنامه را سفارش داده از من خواست که محیط برنامه طوری باشه که در ابتدا که برنامه اجرا میشه ، لیست همه ی کتابها دیده بشه ، مثل شکلی که قرار دادم.

امروز به دلم افتاد با برنامه را با تعداد رکورد های زیاد امتحان کنم ، وقتی تعداد حدود 2000 رکورد ثبت شد ، حدود 20 ثانیه جهت بالا آمدن برنامه باید منتظر بمانم ، تا رکوردها در دیتاگرید پر شود ، و زمانی که تعداد رکوردهای ثبت شده به 7000 رسید ، تقریبا برنامه از کار افتاد ، یعنی پس از هر رکورد ، چون باید کد 7000 کتاب نمایش داده بشه ، حدود 40 ثانیه وقت می گیره .
اگر نیاز نباشد کل کتابها را پس از ثبت هر کتاب و یا در هنگام بالا آمدن برنامه نشان دهم ، مشکلی وجود نداره ! مانده ام که چه کار کنم ! برای نمایش داده ها در دیتا گرید از کد زیر استفاده می کنم ، اگر کد مشکل داره ، لطف کنید بفرمایید!


Try

Dim com4select As New OleDb.OleDbCommand
Dim da As New OleDb.OleDbDataAdapter
Dim ds As New DataSet
ds.Clear()
com4select.CommandText = "SELECT * FROM bookinfo order by bookid"
com4select.Connection = CN
da.SelectCommand = com4select
da.Fill(ds, "bookinfo")
DataGridView1.DataSource = ds
DataGridView1.DataMember = "bookinfo"
Catch
End Try


خواهش می کنم راهنمایی کنید !
لطفا در مورد ظاهر برنامه هم که عکس از آن قرار دادم نظرتون رو بفرمایید

اَرژنگ
شنبه 27 بهمن 1386, 02:13 صبح
اگر نیاز نباشد کل کتابها را پس از ثبت هر کتاب و یا در هنگام بالا آمدن برنامه نشان دهم ، مشکلی وجود نداره ! مانده ام که چه کار کنم !

خوب چه نیازی هستش که کل کتابها را پس از ثبت هر کتاب و یا در هنگام بالا آمدن برنامه نشان بدید؟

Dariuosh
شنبه 27 بهمن 1386, 09:06 صبح
طرفی که برنامه را سفارش داده از من خواست که محیط برنامه طوری باشه که در ابتدا که برنامه اجرا میشه ، لیست همه ی کتابها دیده بشه ، مثل شکلی که قرار دادم.

کدوم شکل :متفکر:
بدشم میتونی بر اساس حروف الفبا لیست کنی که به ازایه انتخاب هر حرف یه Select جداگونه که تعداد رکوردا کمتر شه

visual_sadegh
شنبه 27 بهمن 1386, 09:38 صبح
طرفی که برنامه را سفارش داده از من خواست که محیط برنامه طوری باشه که در ابتدا که برنامه اجرا میشه ، لیست همه ی کتابها دیده بشه
معمولا کسانی که برنامه رو سفارش میدن خواسته خودشونو دقیقا نمی تونن بیان کنن به نظر می یاد کارفرمای شما منظور دیگه ای داشته معمولا دلیلی برای اینکار وجود نداره جز برای ارسال به چاپگر
توصیه من اینه که حتی المقدور رکود های مورد نیازتونو یکی یکی فراخوانی کنید که هم توی حافظه صرفه جویی بشه و هم سرعت برنامه کم نشه
ولی اگه همچنان اصرار دارید می تونید تعداد فیلد هایی که فراخوانی می کنید رو کم کنید مثلا فقط نام کتاب رو توی دیتاگرید نمایش بدید.

babakj
شنبه 27 بهمن 1386, 10:03 صبح
1- به جای اینکه بنویسی SELECT * FROM bookinfo order by bookid
اسم فیلدیا فیلدهایی رو که لازم داری بنویس یعنی
SELECT bookid,BookName FROM bookinfo order by bookid
2- از PK حتما استفاده بکن
3- موقع نمایش لیست کتابها همه رو باهم نیار روی صفحه بلکه اونا رو صفحه بندی کن pagin

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

saman_itc
شنبه 27 بهمن 1386, 11:08 صبح
2- از PK حتما استفاده بکنمیشه در این مورد تو ضیح بدی؟
و دستور این ؟
برنامه باید Search داشته باشه یا مثلا 50 تا کتاب آخر رو نشون بده توی صفحه اول

maryam_vb
شنبه 27 بهمن 1386, 12:14 عصر
اصلا نمایش کل کتاب ها برای طرف(سفارش دهنده) چه سودی داره ؟

میتونی در صفحه اول تعداد کل کتابها - تعداد کتابها در هر حیطه و ... به روشی مناسب اعلام کنی و جهت نمایش ،سرچ های مختلفی رو برای کاربر قرار بدی مثلا سرچ بر اساس حیطه - عنوان - شابک و ...
و اگه طرف (منظورم سفارش دهنده است) علاقه خاصی به دیدن کلیه کتاب ها داره کتاب های مربوط یه یک حیطه رو بنا به اختیارش نشون بدی. براش یه گزارش گیری هم بذار که اطلاعات کلیه کتاب ها رو بتونه پرینت بگیره .

alih988
شنبه 27 بهمن 1386, 16:00 عصر
دوستان عزیز بسیار از راهنمایی شما ممنونم ، راستش امروز با چند نفر صحبت می کردم ، گفتند حتما یه جای کدت اشکال داره ، چون برنامه ای که نتونه 7000 رکورد رو به راحتی نمایش بنده به درد نمی خورده ، مثلا همین امروز خودم با نرم افزار دانشگاهمون داشتم کار می کردم ، کل دانشجوهای ترم جدید را جستجو کردم که 3400 نتیجه در عرض 3 ثانیه به من برگردوند ، و یا امروز حدود 100000 رکورد با یک فیلد در دیتاگرید ایجاد کردم که شاید 7 ثانیه طول کشید !

پس به نظر شما من بعضی از فیلدها که خیلی ضروری هست رو فقط نمایش بدم ؟

و آیا این مشکل طبیعی است ؟

در ضمن در مورد عکس برنامه هم ، دیشب ظاهرا سایت کمی مشکل داشت ، به هرحال الان عکس را قرار دادم!

alih988
شنبه 27 بهمن 1386, 20:38 عصر
عزیزان لطفا راهنمایی کنید

ghafoori
شنبه 27 بهمن 1386, 21:21 عصر
دوست عزیز ابتدا بانک اکسس برای تعداد رکورد بالا پیشنهاد نمی شه چون از قابلیتهای مثل catch و غیره استفاده نمی کند اگر برنامه شما حجمش داده هاش خیلی زیاد می شه باید از بانک دیگر مثل sql server استفاده کنید
در مورد بعدی دیتاگرید برای نمایش این تعداد گرید خوب نیست بیشتری کندی هم از گرید است بهتر است از روش دیگری برای نمایش اطلاعات استفاده کنید
بعد هم می توانید از متد BeginExecuteNonQuery کلاس sqlcommand استفاده کنید این متد برای گرفتن نتیجه های بزرگ از بانک است در این مورد هم درسایت مطالبی وجود دارد

saman_itc
شنبه 27 بهمن 1386, 22:03 عصر
بهتر است از روش دیگری برای نمایش اطلاعات استفاده کنید

از چی آقای قفوری

آقای babakj (http://barnamenevis.org/forum/member.php?u=34739) من منتظر جوابتون هستم

nasseritemp
شنبه 27 بهمن 1386, 22:53 عصر
شما میتونید در ابتدا DataTableتون رو با 50 رکورد اول(یا کمتر) Fill کنید. بعد موقع Search هم DataTable رو به نسبت هدف جستجو پر کنید.

saman_itc
یک شنبه 28 بهمن 1386, 08:23 صبح
شما میتونید در ابتدا DataTableتون رو با 50 رکورد اول(یا کمتر) Fill کنید. بعد موقع Search هم DataTable رو به نسبت هدف جستجو پر کنید.
این مطلب دوستومون گفته .شما بفرمایید با چه دستوری میشه 50 تا آخر Fill کرد و چه ایتمی از DGV پر سرعت تره با این امکانات

ghafoori
یک شنبه 28 بهمن 1386, 09:33 صبح
این مطلب دوستومون گفته .شما بفرمایید با چه دستوری میشه 50 تا آخر Fill کرد و چه ایتمی از DGV پر سرعت تره با این امکانات

با دستور sql زیر کافی است از کلمه کلیدی top استفاده کنید

SELECT TOP (2) ColumnA FROM Table1
ORDER BY ColumnA

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

برای نمایش این تعداد هم dgv جالب نیست کاربر این تعداد رکورد را قطعا برای چک کردن نمی خواهد می خواهید از ان مثلا پزینت بگیرد پیشنهاد من برای این کار استفاده از بولید کنندگان گزارش است مثل کریستال استفاده کنید چون برای همین کارها ساخته شده اند

alih988
یک شنبه 28 بهمن 1386, 10:37 صبح
عزیزان خیلی ممنون از راهنمایی شما ، من برنامه ام رو تغییر دادم و با قرار دادن حروف الفبا در زیر جدول ، هر بار به کاربر اجازه میدم که کتابهای هر حرفی را جدا گانه ببیند!

در ضمن اگر امکان دارد در مورد pagin کمی توضیح بدید!

nasseritemp
یک شنبه 28 بهمن 1386, 16:08 عصر
شما بفرمایید با چه دستوری میشه 50 تا آخر Fill کرد


همونطور که گفتم با توجه به هدف جستجو DataTable رو Fill میکنید. مثلا با TextChange یک TaxtBox. شما باید اول سطرهای DataTable رو Clear کنید و بعد با توجه به Query مورد نظرتون اونرو دوباره Fill کنید.

saman_itc
دوشنبه 29 بهمن 1386, 10:24 صبح
Select Limit چطوره؟

reza1944
سه شنبه 30 بهمن 1386, 01:46 صبح
من یه برنامه نوشتم برای کتابخانه شرمنده اینو میگم از برنامه شما دیزاینش بالا تره خوب تر هم عمل میکنه عکس رو هم می زارم ببینی خواستی با سورس در خدمتم برات میزارم

alih988
سه شنبه 30 بهمن 1386, 10:23 صبح
سلام آقا رضا ، راستش طراحی برنامه را خود مشتری به من داد ، و خیلی هم تاکید کرد که همانطور که من میگم باید باشه ، و برنامه کتابخانه من برای کتابخانه شخصی طراحی شده ، یعنی طرف نیاز داشت تا کتابهاشو مدیریت کنه ، و اینکه بخواهد عضو بگیره و حذف کنه و از این جور حرفهای توش نیست ، ولی اگه لطف کنی سورست رو قرار بدی خیلی علاقه مندم ببینم!

VB.NET2005
سه شنبه 30 بهمن 1386, 12:54 عصر
جناب Reza1944 واقعا برنامه توپی ساختین .
اگه امکانش هست میشه سورسشو بزارید . با تشکر . . .

alih988
سه شنبه 30 بهمن 1386, 21:07 عصر
آقا رضا کجایی برادر ؟ اومدی ما رو خاطرخاه کردی رفتی قایم شدی ؟

VB.NET2005
چهارشنبه 01 اسفند 1386, 16:53 عصر
آقا رضا نیستییییییییییییییییییییی یی .

babakj
شنبه 18 اسفند 1386, 20:57 عصر
برای 50 رکورد آخر اول مرتب می کنی بر حسب مثلا Date




Select Top(50) from Table1
ORDER BY Date DESC

saman_itc
یک شنبه 19 اسفند 1386, 16:01 عصر
Select Limit تو PHP استفاده میشه.آیا تو Vb.net هم استفاده میشه؟

mazoolagh
یک شنبه 19 اسفند 1386, 18:09 عصر
مشکل شما احتمالاً در طراحی خود بانک هست. برای یک جدول با 10-15 فیلد و حدود 40-45 هزار رکورد بیشتر از 5-6 ثانیه زمان برای لود شدن گریدویو نیاز نیست. حتی یک جدول با حدود 80 فیلد و 35 هزار رکورد هم در کمتر از 20 ثانیه باید داخل گریدویو بنشینه (زمانها مال یک کامپیوتر پنتیوم 3 یک گیگاهرتز با 512 مگ رم معمولی است و حجم کل دیتابیس هم در حالت فشرده بیشتر از 40 مگابایت هست)

اینکه گفته میشه اکسس برای برای رکوردهای زیاد مناسب نیست برای حالتی هست که رکوردها از یک میلیون و تعداد کاربرهای همزمان چندین بیش از 20-30 نفر باشه (مثل وب)

ضمناً متدهای executenonquery یا scalar و حتی transaction رو هم قبول میکنه.

شما چرا از خود اکسس استفاده نمیکنین؟

mazoolagh
یک شنبه 19 اسفند 1386, 18:14 عصر
Select Limit تو PHP استفاده میشه.آیا تو Vb.net هم استفاده میشه؟

limit مربوط به mysql هست و نه php - اگر بانک شما Mysql باشه باید بتونین ازش استفاده کنین

alih988
سه شنبه 21 اسفند 1386, 00:21 صبح
به نام خدا

بلاخره مشکلم حل شد ، یک قطعه کد جادویی ، که 7000 رکورد که سهله ، 500000 رکورد را در عرض 2 ثانیه ادد میکنه توی

DG.DataBindings.Add("datasource", ds, "bookinfo")