واضح آرشیو وب فارسی:سایت ریسک: Petros22-05-2009, 11:49 PMسلام اول بگم که من کلی در مورد مشکلم تو خود برنامه کلنجار میرم. سایتهای انگلیسی رو نگاه میکنم. فارسی رو نگاه میکنم و بعد پست میدم. منظور اینکه فرتی پست نمیزنم. آب تفاهم نشه. مشکل بنده هم ارور زیر هست. که از Conn.Open میگیره: The ConnectionString property has not been initialized کانکشن استرینگ اینا توی ماژول تعریف شدن. وقتی یه فرم رو که از کانکشن استرینگ استفاده میکنه باز و بسته میکنم و بعد میرم سراغ فرم بعدی که اون هم از کانکشن استرینگ Same و یکی استفاده میکنه این ارور رو میده. مشکل کجاست؟ ممنون آخرین سواله به مولا _H2_23-05-2009, 12:52 AMسلام این خطا فقط وقتی نمایش داده میشود که شما connection جدیدی تولید کنید ولی connectionstring ان را پر نکنید. بدون شک کدهای شما طوری نوشته شده که connectionstring پر نمیشود. میتوانید در لحظه خطا مشاهده کنید که خیصه connectionstring شما خالی است! چک کنید. کافی است کدهای خود را بازنگری کنید و مطمئن شوید هر new یک پرکردن connectionstring را هم همراه دارد. در صورت عدم رفع مشکل کدهای خود را اینجا بگذارید تا ایرادش را بتوان راحت پیدا کرد. shalineh23-05-2009, 03:37 PMسلام اول بگم که من کلی در مورد مشکلم تو خود برنامه کلنجار میرم. سایتهای انگلیسی رو نگاه میکنم. فارسی رو نگاه میکنم و بعد پست میدم. منظور اینکه فرتی پست نمیزنم. آب تفاهم نشه. نه. سوء تفاهم نمیشه! :31: اما یه نکته رو از من داشته باش. دیباگ کردن رو برای اینجور مواقع گذاشته اند . کافیه بخشی رو که ارور میده، بصورت خط به خط دیباگ کنی. اون موقع است که هم ایراد برنامه ات رو پیدا می کنی و هم ایرادهایی رو که اصلا فکر نمی کردی ایجاد بشه ( ارورهای منطقی بهش میگن ) رو پیشگیری میکنی و هم مهمتر از همه، با دیدن دیباگ، خیلی چیزها رو یاد میگیری و در برنامه های بعدی ازش استفاده می کنی. هر چند اگه هزاران سوال هم بپرسی، اگه سوادمون اجازه بده، با جان و دل بهت جواب خواهیم داد. چون با پاسخ دادن به سوالات ، خودمون هم چیزهایی فراوانی یاد می گیریم. :11: Petros23-05-2009, 06:52 PMمن نمیدونم دقیقا کدوم قسمت (با کسره) کد رو بزارم. ولی این تعاریف توی ماژول هستش و پایینی مربوط به From Loud. ارور هم مربوط به فرم لود و Conn.Open هستش. !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! shalineh23-05-2009, 07:16 PMوالله کد شما رو تست کردم . هیچ اروری نداد. اما: برای حل مشکل شما، کد رو بصورت زیر تغییر بده. ببین درست میشه. اگه نشد ، خبرم کن. !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! اگر مشکلت حل نشد، این را هم امتحان کن: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! به نظر من نیازی به باز و بسته کردن کانکشن نیست. Petros23-05-2009, 08:32 PMسلام، خیلی گلی نه، مشکل حل نشد. شالینه جان شما دو فرمه امتحان کردی دیگه؟ درسته؟ شما چیزی در مورد نوشته ی _H2_ میدونید؟ چه طور پر کنمش؟ shalineh23-05-2009, 08:36 PMدیتابیس رو واسم ارسال کن. البته دیتاهاش رو حذف کن تا حجمش کم بشه. بلافاصله واست درستش میکنم. shalineh24-05-2009, 03:37 PMپتروس عزیز، برنامه ات رو بازنگری کردم. چنین برنامه ای باید هم ارور بده. چون کدهای Unmanaged فراوانی رو در پروژه ات دیدم. آنها را یک به یک واست شرح خواهم داد. ابتدا می پردازم به سر منشاء تمام این فسق و فجورها :31: ماجرا از همون کد موجود در frmLogin شروع میشه. جایی که در رویداد btnLogin_Click یک اشتباه تکنیکی رخ داده است. این قطعه کد را دقت کنید: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! در این رویداد ،دوبار CMD تعریف شده است. در حالی که اصلا نیازی به این کار نیست. ( قسمتهای قرمز رنگ ) این یعنی اشغال منابع!! همچنین دستور ExecuteScalar برای هر متغیر دوبار درخواست شده است! چراااااااااا؟ یکبار کافی است. ( قسمتهای سبز رنگ ) و چند اشکال دیگر که از حوصله این بحث خارج است. :46: و اما اشکال اساسی این است: دستور بستن دیتا بیس بعد از دستور بستن فرم صادر شده است!! ( قسمت آبی رنگ ) . بعلاوه دستور باز شدن دیتابیس بدون هیچ شرطی داده شده است، در حالیکه بستن دیتابیس داخل بلاک شرطی قرار دارد. این یعنی فاجعه. توصیه ای واست دارم : همیشه دستور باز کردن دیتابیس رو بلافاصله قبل از عملیات صادر کن. و بلافاصله بعد از عملیات آنرا ببند. ( جاهایی که underLine کردم رو حذف و با کد صورتی Bold جایگزین کن ). در ضمن ، وقتی تمام connection variables در ماجول تعریف شده است ( آنهم از نوع پابلیک ) تعریف این متغیرها در این قسمت چه لزومی دارد؟ ادامه دارد ... shalineh24-05-2009, 04:20 PMو اما فرم 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 نیز صادر شود، تا در صورت بروز هر اروری، اتصال به دیتابیس بسته شود. ادامه دارد ... shalineh24-05-2009, 04:43 PMمی رسیم به فرم frmRestaurantDetails در مرحله لود این فرم، این دستورات صادر شده است: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! باز هم در این فرم شاهد تعریف دوباره روتین ReNewGrid هستیم و همان فراخوانیهای چندین باره این روتین! ( این روتین در تمام فرمها وجود دارد . پس ننگ بر تو باد که این روتین رو بصورت پابلیک و در درون ماجول تعریف نکرده ای. تا تمام فرمها به آن دسترسی داشته باشند. دیتاتیبل و دیتاگرید مورد نظر رو هم میتونستی به عنوان پارامتر این روال در نظر بگیری تا از هر فرم، این پارامترها به این روال ارسال می شدند. ) کلا کپی پیست کردن در یک پروژه برنامه نویسی یعنی یک فاجعه انسانی . بانی این کار هم فرقی با هیتلر ندارد :31: به نظر شما ، دستورات Conn.Open و Conn.Close در این رویداد چه لزومی دارد؟ تا برنامه به آن گیر دهد؟ هیچ!! >> یک دستور ویران کننده رویداد btnUpdate_Click را در این فرم ملاحظه بفرمایید: !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! با دستور Bold شده، کانکشن ما به رحمت ایزدی پیوست و بعد از این ، هر ارجاعی به این کانکشن ، با تنبیهی سخت از سوی ویژوال استودیو همراه خواهد شد. ادامه دارد ... shalineh24-05-2009, 05:08 PMبخش آخر و جمع بندی: در سایر فرمهای این برنامه، باز هم شاهد نابسامانیهایی از نظر ارجاعات و تعاریف مجدد و فراخوانیهای چندین باره هستیم. این برنامه باید از نظر مسائل گفته شده ، اصلاح شود تا بصورت بهینه ای در بیاد. اما یک کلام ، ختم کلام: دستور Conn.Dispose را در تمام فرمهایت حذف کن. تا شاهد ارور فوق نشوی. در همان نگاه اول و با یک دیباگ ساده، منشاء این ارور کشف شد. بقیه مطالب صرفا جهت نقد و بررسی برنامه بود ( به خواسته خود پتروس عزیز ). :11: Petros24-05-2009, 09:24 PMشما که منو با این حرکتتون له کردید. البته میدونم بعدها اینا به درد دوستان دیگه هم خواهد خورد. شالینه جان به اطلاعاتت غبطه خودم. امیدوارم همین جمع رو توی ایران خودمون داشته باشیم. در سایه سار امن ایمان پایدار باشی و جاودان دی: سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 2289]