PDA

View Full Version : اجرای سنگین برنامه



pouria_66
شنبه 13 شهریور 1389, 10:57 صبح
سلام خدمت اساتید محترم
آقا من یه برنامه حسابداری نوشتم که از بانک access و datagride استفاده کردم.
حجم اطلاعات بالاست اما یه برنامه حسابداری با همون حجم اطلاعات حتی بیشتر از اون چیزی که من دارم توی برنامه استفاده میکنم، خیلی سریعتر از برنامه من اجرا میشه.
کلا برنامه خیلی سنگینه و هنگام وارد کردن اطلاعات توی datagride و خوندن اطلاعات از بانک اطلاعاتی برنامه خیلی سنگین اجرا میشه.
dotnetframework 4 رو هم نصب کردم اما تاثیری نداشته.
اگه کسی از آقایون میدونه من چیکار باید کنم که برنامه سبک و روان اجرا بشه به من بگه.
یه سوال دیگه: معادل دستور do events در vb 6 رو توی vb 2010 میخوام.
مرسی از همه

Saman_12
شنبه 13 شهریور 1389, 11:47 صبح
من از پایگاه داده هیچی بلد نیستم اما معادل اون دستور میشه :
Application.DoEvents

ashkan209
شنبه 13 شهریور 1389, 12:01 عصر
حجم اطلاعات بالاست
یعنی چندتا رکورد ؟


کلا برنامه خیلی سنگینه و هنگام وارد کردن اطلاعات توی datagride و خوندن اطلاعات از بانک اطلاعاتی برنامه خیلی سنگین اجرا میشه.
احتمالا گریدتون رو به for یا حلقه پر میکنید ، بهتره که بایند کنید


dotnetframework 4 رو هم نصب کردم اما تاثیری نداشته.
ربطی نداره و تاثیری توی سرعت نداره


یه سوال دیگه: معادل دستور do events در vb 6 رو توی vb 2010 میخوام.
Application.Doevents

pouria_66
شنبه 13 شهریور 1389, 12:19 عصر
یعنی چندتا رکورد ؟

احتمالا گریدتون رو به for یا حلقه پر میکنید ، بهتره که بایند کنید

Application.Doevents

تعداد رکورد ها ممکنه یه 2000 تا برسه یا بیشتر (بهرحال محدودیتی نداره، چون یه شرکت تبلیغاتیه که حجم کارش بالاست)
--------------
آره با حلقه پر میکنم. بایند چجوریه؟اگه میشه یه توضیح کامل بدین ممنون میشم.
در ضمن حتی بعد از پرشدن گرید بازهم موقع نمایش دادن اطلاعات خیلی سنگینه و بریده بریده نشون میده و طول میکشه تا نمایشش بده.
--------------
یه سوال دیگه هم دارم: اینکه اگه امکان داره واستون یه لینک از یه آموزش کامل گزارشگیری واسم بذارین؛ چون هرچی گشتم توی سایت چیزی پیدا نکردم.
واقعا ممنونم که جواب دادین

ricky22
شنبه 13 شهریور 1389, 16:00 عصر
لطفا نمونه کد هاتون برای درج و بازیابی و پر کردن گرید بزارید تا راه حل داد.

محسن شامحمدی
شنبه 13 شهریور 1389, 16:04 عصر
به جای پر کردن با حلقه می تونید از این کد که سرعت بسیار بالاتری نسبت به حلقه داره استفاده کنید
اسم این روش Bind کردنه

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim conn As New SqlConnection("کانشن استرینگ خود را تعریف کنید")
Dim mystring As String
Dim mycommand As SqlCommand
Dim myreader As SqlDataReader
mystring = "select * from contact"
mycommand = New SqlCommand(mystring, conn)
conn.Open()
myreader = mycommand.ExecuteReader
mygridview.DataSource = myreader
mygridview.DataBind()
conn.Close()
End Sub



--------------------------------

لینک آموزش گزارش گیری در وی بی نت
http://www.persiadevelopers.com/articles/report-viewer.aspx

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

nasim bahari
شنبه 13 شهریور 1389, 19:35 عصر
سلام......دوست خوبم

این موضوع زیاد ربطی به برنامه نویسی نداره....البته نه 100% چون یه اشکالاتی هم بوده که دوستای خوبم زحمت کشیدند و توضیح دادند....

کلاً شما نباید از اکسس استفاده کنید.....زیرا محدودیت 3G داره و همین طور خیلی از دستورات SQL رو نمی توان در اون اجرا کرد....و البته پایگاه های 1000000 رکورد به بالا رو میگن پایگاه های حجیم ( البته به خیلی از موارد بستگی داره نه فقط تعداد رکورد ها ) بنابراین 2000 رکورد تعداد خیلی کمی هستش که حتی یه سیستم عادی هم که بخواد باهاش کار کنه به مشکل بر نمی خوره....
در ضمن اگه شما جستجو هاتون طبق کلید اصلی باشه و همچنین از تکنیک Indexing استفاده کنید سرعت بالای در جستجو ها خواهید داشت......

من یه سری موارد که به فکرم رسید در قسمت پایگاه داده رو گفتم ....قسمت برنامه نویسی رو دوستام زحمتشو کشیدن.....که ازشون تشکر می کنم

موفق باشین

Mehdi6052
یک شنبه 14 شهریور 1389, 01:13 صبح
با سلام

منم با nasim bahari (http://www.barnamenevis.org/forum/member.php?u=133976) موافق هستم. برای یک نرم افزار حسابداری بهتر است از پایگاه داده SQL Server استفاده نمائید.
من خودم پایگاه داده نرم افزار همکاران سیستم را دیده ام که در جدول اسناد اون بیشتر از یک میلیون رکورد ذخیره شده بود و با این حال برنامه به راحتی می توانست کار کند.

و یک توصیه به شما دارم که از هر پایگاه داده ای که استفاده می کنید بهتر است برای دریافت اطلاعات و کار با رکوردها از Stored Procejer ها استفاده نمائید. چرا که سرعت کار را به شدت بالا می برد.

ricky22
یک شنبه 14 شهریور 1389, 07:44 صبح
اینی که می گید سرعت کار با SP بالا میره علت اینه که Sql Server یک بار آنها را کامپایل می کند و بعد Cache می کند در نتیجه فقط پارامتر ها ارسال می شود اما بنده در جایی خواندم که در LINQ نیشز همین روش انجام میشود و حتی در Query سمت کلینت اگر از روش پارامتری ساتفاده شود روش همین می باشد.
به نظر من برای سرعت بالا و کیفیت بالا از یک ORM استفاده شود که خودش همه ی اتصالات را مدیریت می کند و 30 % کد نویسی را کم می کند افت سرعت نا محسوسی دارد اما ارزشش را دارد به خصوص برای برنامه های بزرگ بیش از 50 جدول مثلا.
موفق باشید.

pouria_66
یک شنبه 14 شهریور 1389, 12:05 عصر
سلام......دوست خوبم

این موضوع زیاد ربطی به برنامه نویسی نداره....البته نه 100% چون یه اشکالاتی هم بوده که دوستای خوبم زحمت کشیدند و توضیح دادند....

کلاً شما نباید از اکسس استفاده کنید.....زیرا محدودیت 3G داره و همین طور خیلی از دستورات SQL رو نمی توان در اون اجرا کرد....و البته پایگاه های 1000000 رکورد به بالا رو میگن پایگاه های حجیم ( البته به خیلی از موارد بستگی داره نه فقط تعداد رکورد ها ) بنابراین 2000 رکورد تعداد خیلی کمی هستش که حتی یه سیستم عادی هم که بخواد باهاش کار کنه به مشکل بر نمی خوره....
در ضمن اگه شما جستجو هاتون طبق کلید اصلی باشه و همچنین از تکنیک Indexing استفاده کنید سرعت بالای در جستجو ها خواهید داشت......

من یه سری موارد که به فکرم رسید در قسمت پایگاه داده رو گفتم ....قسمت برنامه نویسی رو دوستام زحمتشو کشیدن.....که ازشون تشکر می کنم

موفق باشین

سلام؛ و مرسی که پیگیری میکنید
دوست عزیز nasim bahari اگه شما برنامه رافع رو ببینید اون هم از بانک اطلاعاتی access استفاده کرده و تعداد رکوردهاش هم بالاست.
من هم یه بانک شبیه همون بانک اطلاعاتی رافع ایجاد کردم و تقریبا از همون سیستم برای ذخیره کردن جداول استفاده کردم.
(اینو هم بگم که من خیلی حرفه ای نیستم و دارم یواش یواش یاد میگیرم) واسه همین اصطلاحاتی که شما استفاده کردین رو خیلی متوجه نمیشم. مثلا شما گفتین از تکنیک Indexing استفاده کنم، اگه میشه لطف کنین و بگین چجوری میتونم از این تکنیک استفاده کنم.
در ضمن من SQL بلد نیستم و نمیدونم چه چیزایی نیاز داره.
یکی دیگه از دوستامون هم فرمودن از Stored Procejer استفاده بشه که باز هم بلد نیستم چجوریه!!:افسرده:
در ضمن 09111111111 (http://www.barnamenevis.org/forum/member.php?u=59254) عزیز گفتن که از روش bind استفاده بشه.
لطف هم کردن نمونه کد رو گذاشتن.
من مثلا میخوام حساب یه مشتری رو توی دیتاگرید ببینم. آیا میشه از این روش bind کردن استفاده کرد؟
http://misaghprint.persiangig.com/image/2.gif
من دیتاگریدم رو یه جورایی سفارشی کردم. و ستونهایی رو بهش اضافه کردم.
یا اینکه مثلا وقتی دارم به دفتر روزانه ردیف اضافه میکنم هم حتی خیلی با کندی و زور و زحمت اضافه میشه و تقریبا دو ثانیه ای طول میکشه تا یه ردیف ساده رو به دیتاگریدم اضافه کنه
http://misaghprint.persiangig.com/image/1.gif

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

pouria_66
یک شنبه 14 شهریور 1389, 12:14 عصر
لینک آموزش گزارش گیری در وی بی نت
http://www.persiadevelopers.com/articles/report-viewer.aspx

که البته می تونید از کریستال ریپورت هم استفاده کنید ولی این روش خیلی ساده تره
09111111111 جان عزیز من vs 2010 رو نصب کردم (از روی سی دی) اما crystal Report نصب نشده و وقتی توی اضافات انتخابش میکنم میگه باید از اینترنت دریافت بشه.
اگه لطف کنین بگین چیکار باید کنم باز هم شرمندم میکنین!!
راستی یه برنامه دیگه هم نصب کردم که انگار خیلی امکانات بهتری نسبت به Crystal Report داره اسمش هست StimulsoftReports.Net_2010
به نظر برنامه ی کاملی میاد. اگه آموزشی ازش دارین واسم بذارین ممنونم.

nokhodsiah2001
یک شنبه 14 شهریور 1389, 15:11 عصر
درود

همین طور که دوستان اشاره کردن برای کارهایی با اطلاعات ذخیره شده با رکوردهای زیاد استفاده از SQL بهتره چون به دلایل زیادی که اشاره شد سرعت جستجو ارسال و دریافت اطلاعات بالاتره
ولی اینکه شما با داشتن 600 رکورد فرمت بالا نمیاد موضوع بر می گرده به کد نویسی و شکل پر گردن دیتاگرید

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


Dim ds As DataSet
Dim SQL_cm As sqlCommand
Dim SQL_da As SqlDataAdapter
Dim SQL_cn As SqlConnection


SQL_cm = New SqlCommand("select * from Tbl_TelData ", SQL_cn)
SQL_da = New SqlDataAdapter(SQL_cm)
ds = New DataSet
SQL_da.Fill(ds, "Tbl_TelData")
DataGridView1.DataSource = ds.Tables("Tbl_TelData")

pouria_66
یک شنبه 14 شهریور 1389, 18:32 عصر
درود

همین طور که دوستان اشاره کردن برای کارهایی با اطلاعات ذخیره شده با رکوردهای زیاد استفاده از SQL بهتره چون به دلایل زیادی که اشاره شد سرعت جستجو ارسال و دریافت اطلاعات بالاتره
ولی اینکه شما با داشتن 600 رکورد فرمت بالا نمیاد موضوع بر می گرده به کد نویسی و شکل پر گردن دیتاگرید

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


Dim ds As DataSet
Dim SQL_cm As sqlCommand
Dim SQL_da As SqlDataAdapter
Dim SQL_cn As SqlConnection


SQL_cm = New SqlCommand("select * from Tbl_TelData ", SQL_cn)
SQL_da = New SqlDataAdapter(SQL_cm)
ds = New DataSet
SQL_da.Fill(ds, "Tbl_TelData")
DataGridView1.DataSource = ds.Tables("Tbl_TelData")


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


while dr.read()
datagrideview.rows.add(dr("rozane_radif"),dr("rozane_mod"),dr("rozane_sharh"),dr("rozane_meghdar"), _
dr("rozane_vahed"),dr("rozane_fi"),dr("rozane_kol"),dr("rozane_taraf"),dr("rozane_tozih"))



اینو هم بگم که جدول "rozane" توی بانک اطلاعاتی من ستونهای بیشتری برای ذخیره اطلاعات مورد نیاز هر ردیف داره که نمیخوام اونا رو کاربر ببینه.

ashkan209
دوشنبه 15 شهریور 1389, 12:55 عصر
اگه تصویر برنامه و دیتاگرید رو ببینید متوجه میشید که سفارشی کردم و ستونهاشو دستی بهش دادم. وقتی DataSource دیتاگرید رو یه جدول از بانک قرار میدیم اسم ستونهایی رو که توی بانک اطلاعاتی برای ستونهاش تعریف کردیم توی دیتاگرید قرار میده.
مثلا من میخوام ستونی که توی بانک access گذاشتم "rozane_sharh" ، اطلاعاتش بیاد توی ستون "شرح" قرار بگیره اما با این کار میاد یه ستون به دیتاگرید اضافه میکنه و اسمشو "rozane_sharh" قرار میده.
اگه راهی سراغ دارین که مشخض کنیم هر ستون توی چه ستونی از دیتا گرید قرار بگیره معرفی کنین.
به datagridview بعد از بایند شدن هیچ ستونی add نکنید و از نمونه کد زیر برای map کردن یک اسم به ستون استفاده کنید

DataGridView1.Columns("rozane_sharh").HeaderText = "شرح"

pouria_66
دوشنبه 15 شهریور 1389, 17:39 عصر
به datagridview بعد از بایند شدن هیچ ستونی add نکنید و از نمونه کد زیر برای map کردن یک اسم به ستون استفاده کنید

DataGridView1.Columns("rozane_sharh").HeaderText = "شرح"

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

ashkan209
سه شنبه 16 شهریور 1389, 11:28 صبح
فکر میکنم برای تعیین اندازه هر columns هم میشه از همین روش استفاده کرد؟درسته؟
بله

DataGridView1.Columns("column_name").Width = 150

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

اگر از دیتابیس access استفاده میکنید(که همانطور که دوستان گفتند ، پیشنهاد میشه از SQL Server استفاده کنید) ، یکبار table هاتون رو Compact & Repair کنید (با استفاده از tools خود access) و دوباره برنامتون رو تست کنید
اگه مشکل مرتفع نشد ، می بایست اون کدهایی که مربوط به پروسه کند اجرا شدن هست رو بذارین ، تا بشه نظر داد

pouria_66
چهارشنبه 17 شهریور 1389, 10:57 صبح
بله

DataGridView1.Columns("column_name").Width = 150


اگر از دیتابیس access استفاده میکنید(که همانطور که دوستان گفتند ، پیشنهاد میشه از SQL Server استفاده کنید) ، یکبار table هاتون رو Compact & Repair کنید (با استفاده از tools خود access) و دوباره برنامتون رو تست کنید
اگه مشکل مرتفع نشد ، می بایست اون کدهایی که مربوط به پروسه کند اجرا شدن هست رو بذارین ، تا بشه نظر داد

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

morrning
چهارشنبه 17 شهریور 1389, 11:40 صبح
کلا دات نت تو بحث سرعت اجرا کمی کنده و نمیشه کاریش کرد دلیلش رو هم دوستان توضیح دادن . به نظر من برای برنامه های حرفه ای بهترین گذینه c++ هست .