معرفی ADO و کاربرد آن در ASP
ارتباط ASP با بانك های اطلاعاتی از طريق واسطی بنام ADO انجام می گيرد. با استفاده از رابط فوق می توان به انواع داده های ذخيره شده بسادگی، در كمترين زمان و صرفا بكمك يك مسير دستيابی پيدا كرد. به همين دليل می توان ادعا كرد كه ADO ساده ترين روشی است كه تاكنون برای ذخيره و بازيابی داده ها بوجود آمده است.ADO نسخه ۵ / ۲ دارای پنج شئ اساسی با نام : Connection , Command, RecordSet , Record , Stream است. دو شی Record و Stream در نسخه قبلی ADO وجود نداشتند. در اين مقاله به بررسی برخی از اشياء عمده ADO و متدهای مربوطه آنها خواهيم پرداخت.

شئ Connection
قبل از هر گونه ذخيره و بازيابی داده ها از بانك اطلاعاتی می بايست با ايجاد و مقدار دهی اوليه يك Connection زمينه لازم جهت ارتباط با بانك اطلاعاتی را بوجود آورد. در ADO با استفاده از شی Connection يك ارتباط با بانك اطلاعاتی ايجاد و پس از انجام عمليات دلخواه در رابطه با بانك اطلاعاتی و در زمانيكه به وجود آن ديگر نياز نباشد، می توان آن را حذف كرد. Open كردن يك ارتباط به بانك اطلاعاتی پروژه ای واحد با نام ( ADODB(ActiveX Data Objects Database بوده كه خود شامل تمامی اشياء ADO است. برای ايجاد يك Connection نظير ساير اشياء ASP از متد Server.CreateObject استفاده می گردد.

Dim Conn
Set Conn = Server.CreateObject(“ADODB.Connection”)
بصورت پيش فرض Connection فقط خواندنی می باشند، شما می توانيد وضعيت فوق را تغيير داده و در صورت نياز و بكمك صفات مربوط به شی فوق ارتباطاتی از نوع خواندنی / نوشتنی و يا فقط نوشتنی ايجاد نمائيد. در زمان استفاده از ADO می توان از مجموعه ای ثوابت كه دربردارنده مقادير متفاوتی برای آيتم های متفاوت می باشند و پيشاپيش تعريف شده اند استفاده كرد. اين ثوابت در فايلی با نام Adovbs.inc قرار دارند. بمنظور استفاده از ثوابت فوق در صفحات ASP خود، می بايست فايل فوق را بكمك دستور Include به برنامه های خود ملحق نمائيم.

<!– #INCLUDE FILE=”adovbs.inc” –>
اگر فايل adovbs.inc را توسط اديتوری نظير Notepad فعال نمائيد، ثوابت تعريف شده را بصورت مجموعه ای از گروهها مشاهده خواهيد كرد. پس از ايجاد يك Connection با بانك اطلاعاتی می توان نوع ( Mode ) ارتباط را بكمك استفاده از ثوابت تعريف شده مشخص نمود. در صورتيكه بخواهيم از بانك اطلاعاتی صرفا اطلاعاتی را بخوانيم از ثابت adModeRead ، فقط اطلاعاتی را در بانك اطلاعاتی بنويسيم از ثابت adoModeWrite و در نهايت در صورتيكه قصد داريم بطور همزمان اطلاعاتی را از بانك اطلاعاتی خوانده و در آن اطلاعات جديدی را نيز بنويسيم از ثابت adoModeReadWrite استفاده می گردد. توصيه می گردد با توجه به نوع رفتاری كه با بانك اطلاعاتی خواهيم داشت آن را باز نمائيم چراكه در صورتيكه صرفا قصد خواندن و يا نوشتن را در يك بانك اطلاعاتی داشته باشيم و نخواهيم دو عمليات را با هم انجام دهيم، باز كردن بانك اطلاعاتی بصورت هم خواندنی و هم نوشتنی ( adoModeReadWrite ) سرعت دستيابی به بانك اطلاعاتی را كاهش خواهد داد.

ConnectionString
پس از تعيين Mode، می بايست صفت Connectionstring مربوط به شی Connection را مقدار دهی مناسب نمود. صفت فوق دارای چندين بخش بوده كه می بايست مشخص گردند: نام Provider، نام سرويس دهنده بانك اطلاعاتی، نام بانك اطلاعاتی كه قصد استفاده از آن را داريد، User Id لازم جهت اتصال به بانك اطلاعاتی (UID)، رمز عبور برای كاربرخاص ( PWD ).
هر يك از بخش های فوق توسط علامت “;” از هم جدا می شوند. مثلا در ساده ترين حالت می توانيد از يك Data Source Name يا DSN يا مربوط به ODBC، يك User ID، و يك رمز عبور جهت اتصال به بانك اطلاعاتی استفاده نمائيد. يك DSN خود شامل نام Provider، نام سرويس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی بوده و ديگر نيازی به مشخص نمودن مجدد آنها نخواهد بود. به مثال زير توجه فرمائيد.

Dim Conn

Set Conn = Server.Create0bject(“ADODB.Connection”)
Conn.Mode = adModeReadWrite
Conn.ConnectionString = “DSN=myDSN;UID=Javad;PWD=7474;”
روش فوق بهترين حالت ايجاد يك ارتباط نيست زيرا DSN بصورت پيش فرض از MSDASQL Provider استفاده می كند. اما JET OLEDB Provider بمراتب سريعتر و قابليت های بيشتری را دارا است. بنابراين می توان جهت ارتباط با بانك اطلاعاتی مطابق زير عمل نمود:

Dim Conn, ConnStr
ConnStr= “PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=” + Server.MapPath(Path2DB)
Set Conn = Server.CreateObject(“ADODB.Connection”)
Conn.Mode = adModeReadWrite
Conn.ConnectionString = ConnStr

ConnectionString شامل نام Provider، نام سرويس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی است. در مثال فوق از تابع Server.MapPath برای ترجمه مسير مجازی به مسير واقعی استفاده شده است. مثلا يك بانك اطلاعاتی موجود درwww.Test.com/test.mdb می تواند بصورت واقعی در مسير E:\web\Mydatabase\Test.mdb قرار گرفته باشد. تابع Server.MapPath آدرس نوع اول را به آدرس نوع دوم ترجمه خواهد كرد. توجه داشته باشيم كه شی ADODB.Connection نيازمند آگاهی از مسير واقعی بانك اطلاعاتی است.

فراموش نكنيم كه قبل از باز نمودن Connection، تمامی تغييرات لازم بر روی صفت های مربوطه اعمال گردد. در صورتيكه بخواهيم پس از ايجاد ارتباط با بانك اطلاعاتی يك يا چند صفت مرتبط را تغيير دهيم، می بايست در ابتدا ارتباط خود را با بانك اطلا عاتی قطع (Connection، بسته گردد) و در ادامه تغييرات لازم را از طريق صفات مربوطه اعمال و مجددا Connection را برقرار نمود.

بمنظور باز نمودن يك Connection از متد Open مربوط به شئ Connection استفاده می گردد.
متد Connection.Open
در صورتيكه متد فوق بدون خطا اجرا گردد، يك ارتباط كاری ( عملياتی) با بانك اطلاعاتی ايجاد شده است.
متد Connection.Execute
برای بازيابی داده ها از يك بانك اطلاعاتی توسط ADO سه روش عمده وجود دارد. تمامی آنها در مرحله اول نياز به ارتباط با بانك اطلاعاتی خواهند داشت. ساده ترين حالت استفاده از متد Execute مربوط به شی Connection است. متد فوق سه پارامتر را خواهد داشت:- يك دستور SQL، يا Query، Table، View يا نام يك Stored Procedure كه توسط پارامتر CommandText مشخص خواهد شد.

• يك متغير با نام RecordsAffected، كه شامل تعداد ركوردهائی خواهد بود كه با توجه به Query اجرا شده توسط متد Execute مشخص می شود.
• يك ثابت اختياری با نام CommandTypeEnum كه به بانك اطلاعاتی خواهد گفت چه نوع عبارت و يا Query را می خواهيد اجرا نمائيد و اينكه يك شی Recordset را برگرداند يا خير.
پس از اجرای متد Execute ( به هر روش ممكن )، ركوردهای برگردانده شده در شئ RecordSet برگردانده خواهند شد. در صورتيكه از دستور SELECT استفاده شود ركوردهای برگردانده شده در شی RecordSet قرار خواهند گرفت. اما زمانيكه از دستورات INSERT و يا UPDATE استفاده گردد رکوردی باز گردانده نخواهد شد.
شئ RecordSet
از شی RecordSet جهت نگهداری رکوردها يا جدول دريافتی استفاده می گردد. اين شئ نظير يك جدول بانك اطلاعاتی دارای سطرها و ستون هائی است. در حقيقت شئ فوق يك تصور مجازی از يك جدول خواهد داد و بصورت فيزيكی يك جدول نيست. چراكه مقادير مورد نظری كه در ستون های اين شئ قرار می گيرد ممكن است حاصل تركيب (Join) چندين جدول ديگر باشند.

متد RecordSet.Open
در صورتيكه در هنگام استفاده از شئ RecordSet به هر نوع Cursor ( اشاره گری به هر يك از سطرهای موجود در جدول ) نياز داشته باشيد ( صرفا نه يك Cursor كه بصورت Forward-Only و يا Read-Only باشد ) می بايست به جای استفاده از متد Execute مربوط به شی Connection، مستقيما بانك اطلاعاتی را باز کنيد. شئ RecordSet نيز دارای متدی با نام Open است كه چندين پارامتر را بعنوان پارامتر اخذ می كند.
Recordset.Open CommandText, Connection|ConnectionString, Cursor-Type, LockType, Options
CommandText شامل SQL query بوده، Connection|ConnectionString شامل يك رجوع به شئ Connection باز شده و يا يك پارامتر معتبر Connectionstring است. پارامتر CursorType مقدار خود را از ثابتی با نام adCursorTypeEnm مطابق زير اخذ خواهد كرد:

• adopenForwardOnly: يك Cursor كه فقط امكان حركت بسمت جلو را دارد، برمی گرداند. ( پيش فرض). اگر نوع Cursor را مشخص ننمائيد، ADO همواره Cursor از اين نوع را بر می گرداند. همانگونه كه از نام آن مشخص است، صرفا می توان بسمت جلو در شئ RecordSet حركت نمود.
• AdOpenKeyset: يك Cursor از نوع Keyset را برمی گرداند. در چنين حالتی می توان جهت و نوع حركت را به هر نوع دلخواه انتخاب نمود (اولين ركورد، آخرين ركورد، بسمت جلو، بسمت عقب…). سرويس دهنده برای هر يك از سطرهای موجود در شئ RecordSet پس از اجرای Query يك Bookmark، ايجاد می كند. اين Bookmark ها تا زمانيكه شئ Recordset حيات دارد تغيير نخواهند كرد بنابراين در صورتی كه يك ركورد جديد توسط كاربر ديگری در بانك اطلاعاتی در آن زمان درج گردد، آن رکورد جديد برای ما قابل رؤيت نخواهد بود.
• adOpenDynamic: يك Cursor پويا را برمی گرداند. اين نوع Cursor مشابه Keyset است با اين تفاوت كه امكان مشاهده ركوردهای جديد نيز وجود خواهد داشت. يك Cursor پويا بصورت پيوسته ركوردهای جديد و يا تغيير يافته را بررسی و حاصل را در شی RecordSet بصورت پويا منعكس خواهد كرد.
• adOpenStatic: يك Cursor ايستا بهمراه تعداد ثابتی از ركوردها را برمی گرداند. در چنين حالتی تغييرات و درج ركوردهای جديد در بانك در همان لحظه مشاهده نخواهد شد مگر اينكه مجددا درخواست بازيابی اطلاعات از بانك صادر شود.
پارامتر LockType، به ADO خواهد گفت كه چگونه با مسئله Lock در بانك اطلاعاتی رفتار نمايد. در حالت كلی می بايست برای اعمال تغييرات و يا درج ركوردهای جديد، پيش بينی های لازم را انجام داد. چراكه Lock ايجاد شده توسط يك كاربر می تواند باعث بروز مسائلی برای ساير كاربران گردد. مقدار اين پارامتر مطابق زير خواهد بود:
• adLockReadOnly: فقط خواندنی، امكان تغيير داده ها وجود نخواهد داشت.
• adLockPessimistic: قويترين نوع Lock است. ركوردهائی كه بدين صورت Lock خواهند شد توسط ساير كاربران قابل دستيابی نخواهند بود. ركوردها زمانيكه سرويس دهنده آنها را برمی گرداند Lock شده و تا زمانيكه شئ RecordSet وجود دارد، امكان استفاده از اين ركوردها برای سايرين وجود نخواهد داشت.
• adLockoptimistic: اين نوع Lock صرفا در زمان بهنگام سازی يك ركورد اعمال شده و بلافاصله ركورد از حالت Lock آزاد می گردد. بنابراين در مراحلی كه لازم است يك ركورد تغيير يابد می توان از اين نوع Lock استفاده كرد. و پس از اعمال تغييرات بصورت اتوماتيك، Lock آزاد خواهد شد.

• AdLockBatchOptimistic: اين نوع Lock مشابه Optimistic است با اين تفاوت كه آنها برای بهنگام سازی Batch مورد استفاده قرار می گيرند. در اين حالت مجموعه ای از ركوردها در يك مقطع زمانی بهنگام سازی خواهند شد ( بجای اينكه هر كورد بهنگام سازی گردد ). با توجه به نوع نرم افزار طراحی شده و ميزان محاوره ای بودن آن، می توان تصميم به استفاده از اين نوع Lock و يا Optimistic نمود.