واضح آرشیو وب فارسی:سایت ریسک: دسترسی به متغییر amozesh 13 شهريور 1388, 17:57سلام من می خوام متغییری تعریف کنم که تا زمانی که اپلیکشن باز هست اون متغییر از بین نره و بشه مقدارش رو تغییر داد توی asp.net خوب شاید بگید باید اون متغییر رو از نوع Shared تعریف کنم ولی این تا موقعی که توی Web Developer پروژه اجراست کار می کنه ولی وقتی خروجی رو توی IIS می بینم متغییر مقدار NULL بر می گردونه توضیح بیشتر: 1- من متغییرمو توی اپلیکشین اسارت مقدار می دم 2- به هیچ وجه نمی خوام از Session یا Application یا Caching استفاده کنم 3- من متغیرمو به این شکل تعریف کردم Public Shared MyString As String 4- متغییر رو می خوام از یک DLL دیگه بهش دسترسی داشته باشم لطفا دستوری رو که می خواهید بگید حتما توی IIS امتحان کنید اگر جواب داد بعد مطرح کنید با تشکر sepidweb 13 شهريور 1388, 18:06می تونی یه کلاس ایجاد کنی و یه متغیر از نوع static در اون قرار بدی. Public static MyString As String برای کل زمان اجرای application مقدارش باقی می مونه. ضمنا همیشه مطمئن شو مقدارش null نیست (برای اولین دسترسی) sepidweb 13 شهريور 1388, 18:10عذرخواهی می کنم، مثل اینکه static در #C می شه همون shared در VB. اما من مشکلی با static یا همون shared در VB نداشتم. چه در IIS و چه در webdeveloper. مطمئنا مشکل در منطق برنامه شماست که مقدار اولیه رو درست نمی دید. کد های مرتبط رو بذارید ببینیم. amozesh 13 شهريور 1388, 19:18من این متغییر رو از یک اسمبلی دیگه مقدار دهی می کنم کدم هم به این صورته Public Class Connection Private Shared Str As String Shared ReadOnly Property ConnectionString() As String Get Return Str End Get End Property Public Shared Sub SetConnection(ByVal Connection As String) Str = Connection End Sub End Class اینم کد C# public class Connection { private static string Str; public static string ConnectionString { get { return Str; } } public static void SetConnection(string Connection) { Str = Connection; } } sepidweb 13 شهريور 1388, 19:53چند نکته: اولا نیازی به داشتن متد SetConnection نیست. وقتی یک property با نام connectionString دارید، می تونید براش setter هم معین کنید! public static string ConnectionString { get { return Str; } set{ Str = value; } } ظاهرا کد vb هم با #C فرق می کنه، اما نمی فهمم چرا اول اون رو read-only کردید، و بعد یه public setter براش تعریف کردید. ویرایش: نکته بعدی به این پست ارتباط نداره. اشتباه لفظی بود! :neutral: ولی چون ممکنه به درد بقیه بخوره پاکش نکردم. نکته دوم اینه که به نظر می رسه شما دارید یک شیء connection رو در اینجا ایجاد می کنید و می خواید در کل نرم افزار از اون استفاده کنید. اما این کار کاملا اشتباه هست. چون اگر بخواید فرضا دو query رو از طریق اون ارسال کنید، دومی حتما باید منتظر بمونه تا اولی به اتمام برسه. حالا این موضوع برای ده تا، یا صد تا، خیلی بدتر می شه. بهتر اینه که هر بار نیاز داشتید یه connection جدید بسازید و برای این کار هم بهتره یه connection factory بنویسید. ضمنا نگران مدت زمان مورد نیاز برای ایجاد connection نباشید، چون با وجود connection pooling و فعال بودن اون به طور پیش فرض تقریبا چیزی که شما به دنبال اون هستید (یعنی افزایش بازدهی با استفاده از connection های موجود و عدم نیاز به باز کردن connection های جدید). حالا می رسیم به سوال اصلی که چرا متغیر static مقدار خودش رو حفظ نمیکنه. این مقدار کدی که گذاشتین کافی نیست. به نظر باید کار کنه! اگر فکر می کنید هنوز جواب سوال رو نیاز دارید، قسمتی که کد رو مقدار دهی می کنه رو هم بذارید. MDP 13 شهريور 1388, 20:17استفاده از کانکش های دستی بلکل منسوخ شده.الان با وجود دیاست ها نیازی به تولید با دست نیست . . . mo.esmp 13 شهريور 1388, 20:35نوع داده ای static فقد يکبار مقدار دهی اوليه ميشود آنهم يا در زمان تعريف متغير يا در سازنده کلاس. در صورتی که مقدار دهی اوليه نشود کامپايلر بطور پيش فرض مقدار صفر به آن ميدهد. شما چون متغيرتون رو مقدار دهيه اوليه نکرديد کامپايلر به آن مقدار Null داده است. public class Connection { public static string Str = "Some String"; //OR use class constructor public Connection(string someText) { Str = someText; } } البته اگه با ديتابيس اينا سرو کار داريد بهتره ConnectionString رو در Web.Config ذخيره يا از WebConfig اون رو بگيريد تا اينکه از يک عضو داده ای static از نوع string استفاده کنيد. برای اطلاع بيشتر از نوع static به لينک های زير مراجعه کنيد. amozesh 13 شهريور 1388, 22:28اساتید محترم 1- MDP جان بنده می دونم می تونم کانکشنم رو توی Web.Config ست کنم و خودش هم کانکشن استرینگ داره که میشه توی کل پروژه ازش استفاده کرد قبلا هم همین کارو می کردم ولی بنا به دلایلی نمی خوام از اون استفاده کنم 2- mo.esmp جان چرا نمیشه مقدارش رو عوض کرد من جای دیگه این کارو کردم و درست هم کار میکنه ولی اینجا نمی دونم چرا کار نمی کنه ولی بازم شاید شما درست می گید پیشنهادتون چیه؟ چیکار کنم؟ 3- اصلا کانکشن به کنار من یک کلاس دارم که اعضام رو با مشخصاتشون توش نگه می دارم چه جوری باید کاری کنم که کلاس پاک نشه بدون Application راستش یک پروژه خالی ایجاد کردم و کلاسم رو به صورت یک اسمبلی خارجی به سایت اضافه و متغییر رو مثل قبل توی Application Start مقدار دهی کردم و درست هم کار کرد ولی توی این پروژه نمی دونم چرا Null بر می گردونه خیلی عجیبه چون توی هر دو یک کد و یک دستور رو نوشتم sepidweb 13 شهريور 1388, 22:37اینطوری نمی شه هیچ کاریش کرد. حتما نمونه کد بذارید، یا یه پروژه نمونه بفرستید ببینیم چشه. اما کاری که من اگر جای شما بودم برای امتحان کردن انجام می دادم، این بود که بعد از این که null بر می گردونه، همونجا با استفاده از همون public-setter مقدارش رو تغییر می دادم، و بعدش مقدارش رو می گرفتم ببینم اصلا درست set می شه یا نه. mo.esmp 13 شهريور 1388, 23:312- mo.esmp جان چرا نمیشه مقدارش رو عوض کرد يادم نمياد نوشته باشم نميشه مقدارش رو نميشه عوض کرد. چه جوری باید کاری کنم که کلاس پاک نشه بدون Application با خروج برنامه از حافظه محتويات متغير های برنامه هم پاک ميشه پس برای نگهداری ديتا بايد اونا رو در فايلی چيزی ذخيره کنی که در مراجعه بعدی بتونی به اونا دسترسی پيدا کنی. همونطور که دوستمون sepidweb گفتن اطلاعات کاملتری بديد تا دوستان بتونن راهنمايی کنن. amozesh 15 شهريور 1388, 20:49با سلام مجدد خدمت دوستان خوب من این فایل رو دو روز پیش آماده کرده بودم ولی به انتقال سرور خورد. فکر کنم توی این پروژه کاری که می خوام بکنم کاملا مشخص باشه. ضمنا تمامی اطلاعات من توی دیتا بیس ذخیره می شه فقط برای اینکه نیاز به اجرای اتصال های بی مورد نباشه این کارو انجام می دم. این کلاس الان کاملا درست کار می کنه چه روی Web Developer چه IIS ولی می خوام بدونم: 1- ممکن این کلاس قبل از Application End از روی حافظه پاک بشه یا نه؟ 2- من همین کار رو توی یک پروژه دیگه انجام دادم ولی همطور که گفتم Null بر می گردونه ممکن مشکل از کجا باشه؟ 3- اگه روش بهتری سراغ دارید پیشنهاد بدید بدون Application با تشکر از کسایی که وقت می زارن و جواب می دن MDP 18 شهريور 1388, 12:10با سلام مجدد خدمت دوستان خوب من این فایل رو دو روز پیش آماده کرده بودم ولی به انتقال سرور خورد. فکر کنم توی این پروژه کاری که می خوام بکنم کاملا مشخص باشه. ضمنا تمامی اطلاعات من توی دیتا بیس ذخیره می شه فقط برای اینکه نیاز به اجرای اتصال های بی مورد نباشه این کارو انجام می دم. این کلاس الان کاملا درست کار می کنه چه روی Web Developer چه IIS ولی می خوام بدونم: 1- ممکن این کلاس قبل از Application End از روی حافظه پاک بشه یا نه؟ 2- من همین کار رو توی یک پروژه دیگه انجام دادم ولی همطور که گفتم Null بر می گردونه ممکن مشکل از کجا باشه؟ 3- اگه روش بهتری سراغ دارید پیشنهاد بدید بدون Application با تشکر از کسایی که وقت می زارن و جواب می دن سلام بله ممکنه دوست من.اگر لایف تایم یک متغیر تموم بشه پاک میشه.راه حل کار اینه که توی Session_start اونو چک کنید اگر NUll شده بود دوباره بسازیدش. روش بهترم هم اینه که از DataSet ها یا در سطح پایین تر از ApplicationBlock استفاده کنید. اگر از دات نت 3.5 هم استفاده میکنید از قدرت بسیار زیاد LINQ استفاده کنید روش استفاده از کانکشن های دست ساز حالا به هر روشی،فشار زیادی به دیتابیس میاره.و جدا از اون باعث افت زمان لودینگ میشه. موفق باشید...:rose: amozesh 20 شهريور 1388, 14:24سلام بله ممکنه دوست من.اگر لایف تایم یک متغیر تموم بشه پاک میشه.راه حل کار اینه که توی Session_start اونو چک کنید اگر NUll شده بود دوباره بسازیدش. روش بهترم هم اینه که از DataSet ها یا در سطح پایین تر از ApplicationBlock استفاده کنید. اگر از دات نت 3.5 هم استفاده میکنید از قدرت بسیار زیاد LINQ استفاده کنید روش استفاده از کانکشن های دست ساز حالا به هر روشی،فشار زیادی به دیتابیس میاره.و جدا از اون باعث افت زمان لودینگ میشه. موفق باشید...:rose: سلام خیلی ممنون از جوابتون فکر کنم شما پروژه ای رو که آپلود کرده بودم ندید چون توی اون پروژه من اصلا کانکشنی ندارم فقط یک کلاس که لیست یوزرهام و دسترسی شون رو توش چک می کنم. چه جوری میشه لایف تایم یک متغییر رو زیاد کرد چون اگر قرار باشه از بین بره در اصل لیست کل یوزرهای حال حاضرم از بین می ره. من تقریبا سعی کردم همه جا از SqlHelper استفاده کنم که هم سرعت کار رو بالاتر می بره هم پرفورمنس. در مورد ِDataSet هم نمی دونم چه جور استفاده ایش رو منظورتونه ولیSqlDataReader سرعت خیلی بالاتر و استفاده کمتر از منابع نسبت به DataSet داره که من سعی کردم در جاهایی که دستور Select فقط یک Table بر می گردونه از اون استفاده کنم. من از دات نت 3.5 استفاده می کنم ولی نمی دونم LINQ تو این مورد خاص چه کمکی می تونه بهم بکنه اگه میشه بیشتر توضیح بدید. در مورد کانکشن هم فکر نکنم حرف شما درست باشه چون با ایجاد هر کانکشن کانکشن قبلی از بین نمی ره و یک جایی توی حافظه باز باقی می مونه و در صورتی که کانکشن جدیدی که ساختید با قبلی یکی باشه از همون کانکشن باز استفاده می شه. MDP 20 شهريور 1388, 17:17سلام. خوب استفاده از دیتا ست خیلی قوی تر و بهینه تر از کانکشن های دستیه ولی اگه کارتون زیاد نباشه نمی ارزه. در مورد کانکشن ها هم اشتباه میکنید.وقتی متغییری در دات نت رفرنسش از دست میره بلکل.اونی که شما میگید درواقع درسته ولی نه برای حالت عادی برای حالتی که ObjectPulling فعال باشه و برنامه نویس اونو رعایت کرده باشه. اگر اون متغییر زیاد تغییرات کلی نداره تو کش ذخیرش کنید و اطلاعاتش رو بخونید.
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 1809]