ورود

نسخه کامل مشاهده نسخه کامل : یه ارور دیگه



Petros
22-05-2009, 22:49
سلام
اول بگم که من کلی در مورد مشکلم تو خود برنامه کلنجار میرم. سایتهای انگلیسی رو نگاه میکنم. فارسی رو نگاه میکنم و بعد پست میدم. منظور اینکه فرتی پست نمیزنم. آب تفاهم نشه.

مشکل بنده هم ارور زیر هست. که از Conn.Open میگیره:
The ConnectionString property has not been initialized

کانکشن استرینگ اینا توی ماژول تعریف شدن. وقتی یه فرم رو که از کانکشن استرینگ استفاده میکنه باز و بسته میکنم و بعد میرم سراغ فرم بعدی که اون هم از کانکشن استرینگ Same و یکی استفاده میکنه این ارور رو میده.

مشکل کجاست؟
ممنون

آخرین سواله به مولا

_H2_
22-05-2009, 23:52
سلام
این خطا فقط وقتی نمایش داده میشود که شما connection جدیدی تولید کنید ولی connectionstring ان را پر نکنید.
بدون شک کدهای شما طوری نوشته شده که connectionstring پر نمیشود.
میتوانید در لحظه خطا مشاهده کنید که خیصه connectionstring شما خالی است! چک کنید.

کافی است کدهای خود را بازنگری کنید و مطمئن شوید هر new یک پرکردن connectionstring را هم همراه دارد.
در صورت عدم رفع مشکل کدهای خود را اینجا بگذارید تا ایرادش را بتوان راحت پیدا کرد.

shalineh
23-05-2009, 14:37
سلام
اول بگم که من کلی در مورد مشکلم تو خود برنامه کلنجار میرم. سایتهای انگلیسی رو نگاه میکنم. فارسی رو نگاه میکنم و بعد پست میدم. منظور اینکه فرتی پست نمیزنم. آب تفاهم نشه.

نه. سوء تفاهم نمیشه! :31:

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

Petros
23-05-2009, 17:52
من نمیدونم دقیقا کدوم قسمت (با کسره) کد رو بزارم. ولی این تعاریف توی ماژول هستش و پایینی مربوط به From Loud. ارور هم مربوط به فرم لود و Conn.Open هستش.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

shalineh
23-05-2009, 18:16
والله کد شما رو تست کردم . هیچ اروری نداد.
اما:
برای حل مشکل شما، کد رو بصورت زیر تغییر بده. ببین درست میشه. اگه نشد ، خبرم کن.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اگر مشکلت حل نشد، این را هم امتحان کن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

Petros
23-05-2009, 19:32
سلام، خیلی گلی

نه، مشکل حل نشد. شالینه جان شما دو فرمه امتحان کردی دیگه؟ درسته؟

شما چیزی در مورد نوشته ی _H2_ میدونید؟ چه طور پر کنمش؟

shalineh
23-05-2009, 19:36
دیتابیس رو واسم ارسال کن. البته دیتاهاش رو حذف کن تا حجمش کم بشه. بلافاصله واست درستش میکنم.

shalineh
24-05-2009, 14:37
پتروس عزیز، برنامه ات رو بازنگری کردم. چنین برنامه ای باید هم ارور بده. چون کدهای Unmanaged فراوانی رو در پروژه ات دیدم. آنها را یک به یک واست شرح خواهم داد.

ابتدا می پردازم به سر منشاء تمام این فسق و فجورها :31:
ماجرا از همون کد موجود در frmLogin شروع میشه. جایی که در رویداد btnLogin_Click یک اشتباه تکنیکی رخ داده است. این قطعه کد را دقت کنید:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در این رویداد ،دوبار CMD تعریف شده است. در حالی که اصلا نیازی به این کار نیست. ( قسمتهای قرمز رنگ ) این یعنی اشغال منابع!!
همچنین دستور ExecuteScalar برای هر متغیر دوبار درخواست شده است! چراااااااااا؟ یکبار کافی است. ( قسمتهای سبز رنگ )

و چند اشکال دیگر که از حوصله این بحث خارج است. :46:

و اما اشکال اساسی این است: دستور بستن دیتا بیس بعد از دستور بستن فرم صادر شده است!! ( قسمت آبی رنگ ) . بعلاوه دستور باز شدن دیتابیس بدون هیچ شرطی داده شده است، در حالیکه بستن دیتابیس داخل بلاک شرطی قرار دارد. این یعنی فاجعه.
توصیه ای واست دارم : همیشه دستور باز کردن دیتابیس رو بلافاصله قبل از عملیات صادر کن. و بلافاصله بعد از عملیات آنرا ببند. ( جاهایی که underLine کردم رو حذف و با کد صورتی Bold جایگزین کن ).

در ضمن ، وقتی تمام connection variables در ماجول تعریف شده است ( آنهم از نوع پابلیک ) تعریف این متغیرها در این قسمت چه لزومی دارد؟

ادامه دارد ...

shalineh
24-05-2009, 15:20
و اما فرم frmPersonnel

رویداد لود این فرم را دقت کنید:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا روتین ReNewGrid رو با هم مرور می کنیم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در روال لود فرم، شما ابتدا دیتاتیبل ( DT ) را Fill نموده اید. سپس دیتاگرید را به آن وصل کرده اید. درسته؟
سپس روتین ReNewGrid را call کرده اید. یعنی چه؟ یعنی اینکه به دلم نچسبید :31:، دوباره دیتابیس رو باز کن و دیتاگرید رو Fill کن!!
بهتر نبود فقط یکبار ReNewGrid رو در روال لود فرم، صدا می زدید؟ و دیتا گرید را خودتان آپدیت می کردید؟
من از دستور Fill ساده متنفرم. میدونی چرا؟ برای اینکه شما فرض کنید دیتابیس شما دارای چندین صد هزار رکورد است. اجرای دستور Fill ساده حتی برای یکبار هم میتونه هر سیستمی رو فلج کنه ، چه برسه به اینکه این دستور دوبار صادر شود!!! ( آنهم دوبار پشت سر هم ).
دستور Fill حتما باید با آرگومانهای StartRecord و MaxRecord همراه باشد ( OverLoads شماره پنج از این تابع )، تا فقط اطلاعات به تعداد مورد نیاز لود شود نه همه دیتاها. در MSDN هم بر این نکته اصرار شده است و ترجمه عین جمله آنرا برایتان نقل قول میکنم : "تابع Fill بسیار وقت گیر است و چنین فرض شده است که در هر برنامه فقط یکبار صادر می شود".

در این فرم باز هم شاهد این هستیم که Da.SelectCommand تعریف شده است. تعاریف موجود در ماجول چیکاره هستند، خدا داند و پتروس و بس!!! :46:
این درحالی است که دستور دهنده اصلی ما CMD می باشد. و بروز هرگونه اروری از جمله ارور اشاره شده در پست اول ، محتمل است.

در روالهای btnInsert_Click ، btnDelete_Click و btnUpdate_Click باز هم شاهد فراخوانی روتین ReNewGrid هستیم ( تکرا چندین باره دستور Fill ) .

به جای دستور DT.Clear بهتر است از DT.Reset استفاده شود.

تمام دستورات Insert و Update و Delete بهتر است در درون بلاک Try قرار گیرد. علاوه بر اینکه دستور Close باید در درون بلاک اصلی try قید شود ، همین دستور باید در بخش Catch نیز صادر شود، تا در صورت بروز هر اروری، اتصال به دیتابیس بسته شود.

ادامه دارد ...

shalineh
24-05-2009, 15:43
می رسیم به فرم frmRestaurantDetails

در مرحله لود این فرم، این دستورات صادر شده است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

به نظر شما ، دستورات Conn.Open و Conn.Close در این رویداد چه لزومی دارد؟ تا برنامه به آن گیر دهد؟ هیچ!!

>> یک دستور ویران کننده
رویداد btnUpdate_Click را در این فرم ملاحظه بفرمایید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

با دستور Bold شده، کانکشن ما به رحمت ایزدی پیوست و بعد از این ، هر ارجاعی به این کانکشن ، با تنبیهی سخت از سوی ویژوال استودیو همراه خواهد شد.

ادامه دارد ...

shalineh
24-05-2009, 16:08
بخش آخر و جمع بندی:

در سایر فرمهای این برنامه، باز هم شاهد نابسامانیهایی از نظر ارجاعات و تعاریف مجدد و فراخوانیهای چندین باره هستیم.

این برنامه باید از نظر مسائل گفته شده ، اصلاح شود تا بصورت بهینه ای در بیاد.

اما یک کلام ، ختم کلام:
دستور Conn.Dispose را در تمام فرمهایت حذف کن. تا شاهد ارور فوق نشوی.

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

:11:

Petros
24-05-2009, 20:24
شما که منو با این حرکتتون له کردید. البته میدونم بعدها اینا به درد دوستان دیگه هم خواهد خورد.

شالینه جان به اطلاعاتت غبطه خودم.

امیدوارم همین جمع رو توی ایران خودمون داشته باشیم.
در سایه سار امن ایمان پایدار باشی و جاودان دی: