ارتباط به منابع داده در ADO.NET ( بخش سوم )
در بخش اول این مقاله به تشریح انواع Data Provider و در بخش دوم با نحوه ایجاد یک Connection آشنا شدیم . در این بخش به بررسی نحوه مدیریت یک Connection خواهیم پرداخت .
پس از تعریف خصلت ConnectionString مربوط به شی Connection ، می توان با استفاده از متدهای Close و Open ، مدیریت وضعیت Connection جاری را انجام داد . در ادامه با نحوه استفاده از متدهای فوق و پاسخگوئی به رویدادهای Connection آشنا خواهیم شد.
فعال نمودن و غیر فعا ل نمودن یک Connection بمنظور فعال نمودن و یا غیر فعال نمودن یک Connection می توان بصورت تلویحی عملیات فوق را با فراخوانی متدهای یک شی که از Connection استفاده می نمایند انجام و یا با صراحت و بکمک متدهای Open و یا Close اقدام به فعال نمودن و یا غیر فعال نمودن Connection نمود . متدهای Open و Close دو متد اولیه برای هر Connection می باشند .
لازم است به این نکته اشاره گردد که بستن ( غیر فعال نمودن ) یک Connection امری لازم و ضروری است ، چراکه اکثر منابع داده صرفا" تعداد محدودی از ارتباطات فعال را حمایـت نموده و در ضمن ارتباطات فعال ، منابع با ارزش سیستم را اشغال و حجم عملیاتی بر روی سیستم را افزایش خواهند داد .
فعال نمودن و غیر فعال نمودن صریح یک Connection استفاده صریح از متدهای Open و Close بمنظور فعال نمودن و یا غیر فعال نمودن Connection توصیه و دارای مزایای زیر است :
بقیه در ادامه مطلب...................
پس از استفاده Connection ، لازم است که ارتباط ایجاد شده غیر فعال گردد . بدین منظور، می توان از متدهای Close و یا Dispose مربوط به شی Connection استفاده نمود. متد Close ، تراکنش های بلاتکلیف را تعیین تکلیف نموده و در ادامه ارتباط را غیر فعال می نماید . در مواردیکه Pooling فعال شده باشد ، متد فوق باعث آزادسازی ارتباط ایجاد شده از Connection pool می گردد . فراخوانی متد Close توسط یک برنامه می تواند چندین مرتبه صورت پذیرد.
فعال نمودن و غیر فعال نمودن تلویحی یک Connection در صورت استفاده از DataAdapters ، ضرورتی به فعال نمودن و یا غیر فعال نمودن یک Connection وجود نخواهد داشت . زمانیکه یکی از متدهای مربوط به اشیاء فوق ، فراخوانده می گردد ( مثلا" متد Update و یا Fill مربوط به شی SqlDataAdapter ) ، متد مورد نظر بررسی لازم در خصوص فعال بودن ارتباط را انجام و در صورتیکه ارتباط فعال نشده باشد ، SqlDataAdapter ارتباط را فعال و پس از انجام عملیات مورد نظر ، ارتباط را غیر فعال خواهد نمود .
مثال : در صورتیکه یک DataSet داده خود را از چندین جدول متفاوت که در بانک اطلاعاتی مشابه قرار دارند ، دریافت می نماید ،صرفا" یک Connection وجود داشته و دارای چندین DataAdapters خواهیم بود (هر DataAdapters مرتبط با یک جدول ) . در صورتیکه Connection بصورت تلویحی ( عدم استفاده صریح از متدهای Open و Close ) فعال و یا غیر فعال گردد ، در زمان پر نمودن اطلاعات در Dataset ، ارتباط با منبع داده چندین مرتبه فعال و یا غیر فعال خواهد شد . در چنین مواردی مناسب است که در ابتدا Connection با صراحت فعال و پس از فراخوانی متدهای Filling مربوط به چندین DataAdapters ، ارتباط ایجاد شده با منبع داده را با بکارگیری متد Close و باصراحت غیر فعال نمود .
استفاده از متد Dispose زمانیکه یک Connection غیرفعال می گردد ، جریان اطلاعات به و یا از منبع داده غیر فعال می گردد. در چنین حالتی ، منابع غیرمدیریت یافته استفاده شده توسط شی Connection ، آزاد نخواهند گردید.در صورتیکه Connection pooling فعال شده باشد ، عملیات آزاد سازی Connection از Pool نیز انجام خواهد شد. اشیاء SqlConnection و OleDbConnection دارای یک متد Dispose بوده که از آن بمنظور آزادسازی منابع غیرمدیریت یافته استفاده می گردد . با فراخوانی متد Dispose ، عملیات حذف Connection از Connection pool نیز انجام خواهد شد .
مثال : استفاده از متد Dispose در مثال زیر، یک شی SqlConnection ایجاد و در ادامه با استفاده از متد Open فعال و سپس بمنظور غیرفعال نمودن Connection و آزاد سازی منابع استفاده شده توسط Connection از متد Dispose استفاده و در نهایت شی مورد نظر به Nothing مقداردهی شده است .
نحوه استفاده از متد Dispose |
تعریف و نمونه سازی یک شی جدید SqlConnection ' Dim cnNorthwind AS New System.Data.SqlClient.SqlConnection () مقدار دهی مناسب خصلت ConnectionString ' cnNorthwind.ConnectionString = "Data Source="(Local); " & _ "Initial Catalog = Northwind;" & _ "Integrated Security=SSPI;" فعال نمودن Connection ' cnNorthwind.open() انجام عملیات دلخواه و مرتبط با بانک اطلاعاتی ' cnNorthwind.Close() Dispose نمودن ارتباط که باعث حذف connection از connection pool بر روی ' سرویس دهنده می گردد ، ذخیره سازی منابع سرویس دهنده ' cnNortwind.Dispose() آزاد سازی حافظه اشغال شده توسط شی SqlConnection ' cnNorthwind = Nothing |
برخورد با رویدادهای Connection رویداد StateChange زمانی که وضعیت Connection تغییر نماید ، محقق می گردد( وضعیت Connection از فعال به غیر فعال و یا از غیر فعال به فعال تبدیل گردد) .بمنظور برخورد مناسب با هر یک از رویدادها ، از یک Event handler استفاده می گردد. هر رویداد دارای Event handler مختص خود می باشد. Event handler مربوط به رویداد StateChange ، متدی است که دارای آرگومانی از نوع StateChangeEventArgs می باشد . آرگومان فوق، شامل داده مرتبط با رویداد است .
رویداد StateChangeنوع NET data provider . ، که از آن استفاده می گردد ، آرگومان های خاص مربوط به رویداد StateChange را مشخص می نماید :
لازم است بدین نکته اشاره گردد که تمامی رویدادها در دات نت دارای دو پارامتر زیر می باشند :
برای رویداد StateChange ، پارامتر e از نوع StateChangeEventArgs می باشد.
event handler مربوط به دو رویداد فوق ، نوع مشابهی از آرگومان ها را دریافت می نماید : StateChangeEventArgs که شامل داده مرتبط با این رویداد است . جدول زیر خصلت های مربوط به کلاس StateChangeEventArgs را نشان می دهد :
شرح | خصلت |
خصلت فوق ، وضعیت جدید Connection را مشخص می نماید. زمانیکه رویداد محقق گردد، شی Connection همواره در یک وضعیت جدید خواهد بود . | CurrentSatate |
وضعیت اولیه Connection را برمی گرداند . | OriginalSate |
نمونه ای از یک Event Handler مربوط به StateChange مثال زیر نحوه ایجاد StateChangeEventHandler را با VB.NET ، نشان می دهد :
نحوه استفاده ازیک Event Handler با استفاده از VB.NET |
Private Sub cnNorthwind_State ( ByVal Sender As Object , ByVal e As System.Data.StateChangeEventArgs) Handles cnNorthwind.StateChange نمایش وضعیت اولیه و جاری State در یک messagebox ' MessageBox.Show("CurrentState: "& e.Currentstate.ToString() & vbCrLF & _ "OriginalState : " & e.OriginalState.ToString() , _ |