پیش گفتار
در این مقاله فرض بر این است که خواننده :
·
با زبان برنامه نویسی C یا C++ آشناست .
·
فن آوری COM
را می شناسد .
·
و نیز اطلاعات عمومی و کلی در مورد پایگاه داده و SQL دارد .
مقدمه
امروزه داده ها کمتر درون بایگانی های
سنتی یافت می شوند . در عوض درون پایگاههای داده – با ساختارهای بسیار متنوعی – وجود دارند . بطور مثال :
·
file
systems
·
indexed-sequential
files ( Btrieve )
·
personal
databases ( Access | Visual FoxPro )
·
Productivity
tools (Spread sheets |electronic mails )
·
On
the word wide web (www)
در دنیای امروز سازمانها و شرکت ها ،
با حجم عظیمی از اطلاعات روبرو شده اند که پردازش سریع این اطلاعات برای مدیریت
عملکردشان بسیار حیاتی است . بدلیل این نیازها فناوری پایگاه داده به سرعت چشم
گیری رشد کرده است . از مزایای این فناوری می توان به موارد زیر اشاره کرد :
·
declarative
queries
·
transactions
·
Security
سازمانها و شرکت ها برای بهره بردن از این
مزایا مجبور شده اند که داده ها را از سیستم های اولیه به درون انواعی از سیستم
های DBMS (DataBase
Management Systems) منتقل کنند .
مسلما چنین انتقالی پرهزینه است .
علاوه بر این بردن بعضی از ساختارهای اطلاعاتی به درون DBMS های موجود
امکان پذیر نیست . بنابراین باید به دنبال راهی بود تا از مزایای با ارزش این
فناوری بر روی پایگاههای داده ی غیر از DBMS نیز بهره برد .
برای برآورده کردن این نیاز مهم مایکروسافت OLE DB را بوجود آورده
است .
و اما OLE DB
OLE
DB مجموعه ای از Interface های مبتنی بر
فناوری COM
است . Application
ها با استفاده از این Interface ها می توانند دسترسی یکسانی به انواع مختلف پایگاههای داده داشته
باشند . منظور از دسترسی یکسان این است که ابزارهایی که OLE DB در اختیار Application قرار می دهد ،
با تغییر پایگاه داده ، همچنان یکسان می مانند .
OLE
DB علاوه بر آنکه تمام قابلیت ها و
سرویس های DBMS
را در اختیار Application قرار می دهد ، می تواند سرویس ها و قابلیت های جدیدی را نیز به آن
بیفزاید . به عنوان مثال OLE DB داده های پایگاه را بین Application ها Share می کند .
مدل OLE DB و دو مفهوم
اساسی
OLE
DB برای دسترسی Application به داده ها
مدلی را ارائه می دهد . مدل فرض می کند که داده ها مستقیما در دسترس Application نیست بلکه در
انبارهای اطلاعاتی جداگانه ای مانند یک فایل ،
E-mail ، پایگاه داده و یا در منبعی بر روی اینترنت قرار دارند .
Application داده ها را از یک واسطه در خواست می کند . واسطه یک کپی از
اطلاعات را در اختیار APP قرار می دهد . گرچه
ساختارهای نگهداری اطلاعات و روش واکشی و بازیابی آنها از انبارهای اطلاعاتی مختلف
تفاوت می کند ، اما این واسطه چنان نقش بازی می کند که برای Application هیچ فرقی نمی
کند که داده ها را از چه نوع پایگاه داده ای می خواند .
داده هایی که تحویل Application می شوند در یک Cache به منظور یافتن
، بررسی و دست کاری ذخیره می شوند . به علاوه Cache افزودن داده
های جدید ، اصلاح و حذف مواردی از داده ها را سهولت می بخشد . در صورت
لزوم می توان اطلاعات اصلاح شده ی درون Cache را در انبار داده جایگزین کرد .
در مدل OLE DB به واسطه ای که
اطلاعات را برای Application فراهم ( Provide ) می کند ، Provider و به Application که داده ها را مصرف ( Consume ) می کند ، Consumer می گویند . دو مفهوم Provider و Consumer در مدل OLE DBچنان اساسی هستند که باید تمام توصیفات مربوط به فن آوری OLE DB را از درون
آنها تجسم نمود .
از دید فنا آوری COM می توان این دو
مفهوم اساسی را دقیقتر بررسی کرد . Consumer هر جزئی از سیستم یا کدهای Application است که از یک Interface متعلق به OLE DB استفاده می کند
. Provider
نیز هر Object ی است که در قالب COM طراحی شده و ارائه دهنده ی یک Interface متعلق به OLE DB است .
مدل برنامه نویسی OLE DB
OLE
DB
وظایفی را که Consumer و Provider در قبال هم دارند تا داده ها بین آنها و بین انبار داده ها جابجا
شود را در قالب مدلی ارائه کرده است . برنامه نویسان برای طراحی Provider و Consumer باید در قالب
ارائه شده توسط OLE DB برنامه نویسی کنند . واین مدل برنامه نویسی OLE DB است (Programming model )
.
مدل برنامه نویسی OLE DB یک مدل شئی
گراست که Object های آن از COM هستند . هر Object نیز تعدادی Interface دارد که OLE DB وظایف هر کدام را دقیقا بیان کرده است .
از طرف دیگر ساختار پایگاه های داده
طوری طراحی شده اند که عملکردهای خاص و تعریف شده ای جهت دسترسی به داده ها را می
طلبد .
برنامه نویسانی که Provider می نویسند با
دو عملکرد از پیش تعریف شده روبرو هستند . یکی ، روشی که پایگاه داده برای جابجا
کردن اطلاعات در اختیار ما قرار می دهد . دیگری ، عملکردی است که OLE DB برای Interface های خود تعریف
می کند . طراح Provider وظیفه اش نظیر کردن این دو عملکرد تعریف شده به هم است . برنامه
نویسانی که Consumer می نویسند برای دسترسی به داده باید سرویس های ارائه شده توسط Interface ها را صدا
بزنند .
پیاده سازی بعضی از Interface ها برای Provider بنیادین است و
بعضی اختیاری . ممکن است Interface های اختیاری در Provider ی پیاده سازی شده باشند و در Provider دیگری خیر . از
این رو Interface های اختیاری پیاده سازی شده ، یک ویژگی برای Provider است .Consumer ها می توانند
از ویژگی های Provider ها در زمان اجرا باخبر شوند .
برای درک بهتر OLE DB می توان آن را
در دو مدل بررسی کرد . یکی مدل Row و دیگری مدل Binder در این مقاله تنها به مدل اول پرداخته شده است .
مدل برنامه نویسی Row
همانطور که گفته شد Provider از تعدادی object های COM تشکیل شده است
. Consumer
در مدل Row به تعدادی از این object ها نیاز دارد که عبارتند از :
Enumerator
Data Source Object
Session Object
Command Object
Row Object
Row Object
در ابتدا Consumer باید یک نمونه
از Data Source Object بسازد و آن را مقدار دهی اولیه کند . سپس Consumer با استفاده از
این نمونه ، Session Object را بوجود می آورد ، که این object نیز به نوبه ی
خود همانند کارخانه ای برای تولید Command ها و Transaction ها عمل می کند . وظیفه ی اصلی
Session Object
تعریف Transaction
است .
بنابراین object ها طبق یک سلسه
مراتبی ساخته می شوند . به این معنا که object های سطح بالاتر بصورت صریح یا ضمنی object های سطح پائین
تر را می سازند .
Enumerator
با استفاده از این object می توان سیستم
را جستجو کرد و از Data Source Object های موجود با خبر شد .در هنگام پیاده سازی اگر Provider خاصی برای Consumer تعیین نشده
باشد ، می توان در زمان اجرا به وسیله Enumerator ، Provider مناسبی را جستجو ، و در صورت وجود از آن استفاده کرد .
توجه : گرچه در این مدل |Enumerator اولین object است ، ولی اغلب
از روش های دیگری جهت بدست آوردن Data
Source Object استفاده می شود .
جهت دست یابی به Data Source Object
ها و Enumerator
های موجود در سیستم باید از اینترفیس ISourceRow متعلق به Enumerator استفاده کرد .
Data Source Object
Data
Source Object یک object متعلق به COM است که Consumer
از طریق این object با Provider ارتباط برقرار می کند .
Interface های این object در زیر لیست شده اند .
Interface های ضروری ( mandatory )
·
interface
IDBCreateSession;
·
interface
IDBInitialize;
·
interface
IDBProperties;
·
interface
IPersist;
Interface های اختیاری ) optional )
·
interface
IConnectionPointContainer;
·
interface
IDBAsynchStatus;
·
interface
IDBDataSourceAdmin;
·
interface
IDBInfo;
·
interface
IPersistFile;
·
interface
ISupportErrorInfo;
Provider ها به هنگام نصب بر روی سیستم عامل ، کلاسهای Data Source شان را در Registry ثبت
می کنند و از همین طریق Enumerator می تواند آنها
را در Registry
و پیدا کند .
Session Object
این object توابعی برای
ساختن Command
ها و Row
ها دارد . و نیز توابعی برای ساختن و اصلاح کردن Table ها و Index ها در پایگاه
داده ، در اختیار برنامه نویس قرار می دهد .Interface های ضروری و
اختیاری این object در زیر لیست شده اند .
1) mandatory
·
interface
IGetDataSource;
·
interface
IOpenRow;
·
interface
ISessionProperties;
2)
optional
·
interface
IAlterIndex;
·
interface
IAlterTable;
·
interface
IBindResource;
·
interface
ICreateRow;
·
interface
IDBCreateCommand;
·
interface
IDBSchemaRow;
·
interface
IIndexDefinition;
·
interface
ISupportErrorInfo;
·
interface
ITableCreation;
·
interface
ITableDefinition;
·
interface
ITableDefinitionWithConstraints;
·
interface
ITransaction;
·
interface
ITransactionJoin;
·
interface
ITransactionLocal;
·
interface
ITransactionObject;
Consumer برای ساختن یک Session باید تابع IDBCreateSession
:: CreateSession از
Data Source Object
صدا بزند .
یک Data Source Object
می تواند چندین Session را ایجاد کند .
Command Object
این object دستوراتی ( Commands ) را که بصورت text و یا stream می باشند و
برای اجرا روی انبار داده صادر می شوند ، را مدیریت می کند .
این Command را Consumer صادر و provider آن را اجرا می
کند .
Command ها اغلب بصورت
text و دستور رایج SQL مانند SELECT صادر می شوند .
در این حالت Command Object می تواند Row تولید کند .یک Session می تواند چندین Command را ایجاد کند.
هر Command Object دارای ویژگی
هایی است که با
کردن آنها می توان :
·
اجرای Command را کنترل کرد .
·
نحوه ی تشکیل Row بعد از اجرای Command را تعیین کرد .
با استفاده از Command ها می توان
فرایندهای زیر را روی داده ها و ساختار بانک از Provider در خواست کرد
·
insert
·
modify
·
retrive
·
delete
·
otherwise
manipulating
به عنوان مثال text Command زیر یک دستور SQL است که تمام
داده های یک Table از درون یک پایگاه داده ی رابطه ای ( Relational database
) را بازیابی می کند .
“ SELECT * FROM table_name
“
Interface های ضروری و اختیاری این object در زیر لیست شده اند .
1) mandatory
· interface IAccessor;
· interface IColumnsInfo;
· interface ICommand;
· interface ICommandProperties;
· interface ICommandText;
· interface IConvertType;
2 ) optional
· interface IColumnsRow;
· interface ICommandPersist;
· interface ICommandPrepare;
· interface ICommandWithParameters;
· interface ISupportErrorInfo;
· interface ICommandStream;
Row
Object
Row یک Cach است که داده هایی را که از انبار داده آورده می شود نگهداری می
کند . می توان Row را شبیه یک آرایه دو بعدی فرض کرد که دارای تعدادی سطر و ستون است
و در هر ستون یک نوع داده ی خاص وجود دارد .
این object بخش مرکزی Provider است که وظیفه
فراهم کردن داده ها برای Consumer را بر عهده دارد . این داده ها در قالب جدولی ارائه می شوند .
Row در نتیجه ی اجرای یک Command و یا از طریق Session ساخته می شوند
و امکاناتی برای جابجایی بین سطرهای داده وتست و تغییر داده دارد و نیز امکاناتی
برای بازگرداندن داده ی اصلاح شده به درون بانک .
Interface های ضروری و اختیاری این object به قرار زیر است .
1) mandatory
· interface IAccessor;
· interface IColumnsInfo;
· interface IConvertType;
· interface IRow;
· interface IRowInfo;
2 ) optional
· interface IChapteredRow;
· interface IColumnsInfo2;
· interface IColumnsRow;
· interface IConnectionPointContainer;
· interface IDBAsynchStatus;
· interface IGetRow;
· interface IRowChange;
· interface IRowChapterMember;
· interface IRowCurrentIndex;
· interface IRowFind;
· interface IRowIdentity;
· interface IRowIndex;
· interface IRowLocate;
· interface IRowRefresh;
· interface IRowScroll;
· interface IRow;
· interface IRowView;
· interface ISupportErrorInfo;
· interface IRowBookmark;
Row and
Stream
Row عنصری است که تعدادی ستون داده را در بر دارد به
عبارتی بخشی از یک رکورد است . Stream عنصری است که محتویات یک فایل یا e-mail را کپسوله می
کند .
پایان