بسم الله الرحمن الرحيم
السلام عليكم....
لقد بحثت كثيرا عن برمجة قواعد البيانات بواسطة لغة السي بلس وقد اليت علي نفسي ان اكتب هذه المشاركة
التي قد ينتفع بها اخوتي محبي البرمجة بلغة السي.
مقدمة :
هنالك الكثير من تقنيات الوصول الي قواعد البيانات (بل جميع التقنيات) التي يمكن التعامل معها بواسطة لغة السي بلس ،
لكني اخترت تقنية ADO لاتناولها في هذا الموضوع وذلك لسهولة تعلمها وكفائتها بالاضافة الي شهرتها العالية.
ماهي ado؟
Ado اختصار لـ(activex data objects) هي عبارة عن مكون يربط بين قاعد البينات والبرامج ،وهي عبارة عن مجموعة من الكائنات تتيح الاتصال
بقاعدة البيانات واجراء عدة مهام عليها مثل قراء البيانات والكتابة (طبعا يتم ذلك باستخدام لغة Sql او الاجراءات المخزنة). لقد تم بناء ADO علي
تقنية OLE DB وبذلك اصبحت ado عبارة عن الطبقة الاعلي في برمجة OLE DB وقد جعلت ado البرمجة اسهل بكثير من استخدام
OLE DB وحدها. تتيح ado واجهتين للبرمجة احداها للغات النصية مثل VBScript, java script والاخري للغات مثل VB, java, C++ لكن سوف
نستخدم الواجهة التي تتعامل مع لغة C++ فقط.
برمجة قواعد بيانات باستخدام السي بلس وado :
هنالك الكثيرمن مكتبات ado الموجودة علي الانترنت و التي يمكنك استخدامها لكني لن استخدم احداها هنا ،
Ado عبارة عن ملف dll يحتوي علي كائنات com لذلك سوف نقوم بادراج هذا الملف في ببرنامجنا باستخدام التوجيه #import مع المسار الكامل للملف وهو
"C:\program files\common files\system\ado\msado15.dll"
وايضا سوف نستخدم مكتبة OLE/COM وذلك بتضمينها في البرنامج
#include <comdef.h> #import "C:\program files\common files\system\ado\msado15.dll" \ no_namespace \ rename( "EOF", "adoEOF" )
لقد استخدمنا التوجيه #import مع المعلمة no_namespace حتي لا نطر الي ادراج مساحة الاسماء التي يتم انشائها تلقائيا.
ثم غيرنا معلمة نهاية الملف EOF الي اسم اخر حتي لا تتعارض مع مكتبات اخري تستخدم نفس الاسم .
الان يجب ان نقوم بتهيئة COM بواسطة الاجراء AfxOleInit (احدي اجراءات MFC)
AfxOleInit();
انشاء اتصال بقاعدة البيانات:
لانشاء اتصال بقاعدة البيانات نحتاج اولا الي عبارة الاتصال وهي العبارة التي يتم استخدامها بواسطة OLE DB Driver لانشاء
اتصال بقاعدة البيانات . وعبارة الاتصال تعتمد علي نوع قاعدة البيانات التي يراد استخدامها. في حالتنا هذه سوف
نستخدم اكسس وسوف تكون عبارة الاتصال هي:
"Provider = Microsoft.Jet.OLEDB.3.51;Data Source = c:\\der\\mydb.mdb;"
الان ننشئي كائن الاتصال ونستخدم عبارة الاتصال مع كائن الاتصال.
_ConnectionPtr m_pConnection;
HRESULT hr;
hr = m_pConnection.CreateInstance( __uuidof( Connection ) );
if (SUCCEEDED(hr))
{
hr = m_pConnection->Open(
_bstr_t(L"Provider=Microsoft.Jet.OLEDB.3.51;
Data Source=c:\\der\\mydb.mdb;"),
_bstr_t(L""),
_bstr_t(L""),
adModeUnknown);
}القراة والكتابة الي قاعدة البيانات:
لقراءة البيانات تحتاج الي استعلام sql لتحديد اي البيانات التي تريد ان تجري عليها عملية، وذلك عن طريقة كائن الاتصال مباشرة ،
او استخدام كائن الاوامر مع استعلام SQL او اجراء مخزن او استخدام مجموعة البيانات.
(1)استخدام كائن الاتصال لتنفيذ احدي الاستعلامات:
_bstr_t bstrQuery("SELECT * FROM Customers");
_variant_t vRecsAffected(0L);
_RecordsetPtr pRecordSet;
pRecordSet = pDoc->m_pConnection->Execute(bstrQuery, &vRecsAffected, adOptionUnspecified);(2)استخدام كائن الاوامر لتنفيذ احدي الاستعلامات:
_CommandPtr pCommand;
_RecordsetPtr pRS;
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
pCommand.CreateInstance(__uuidof( Command ));
pCommand->ActiveConnection = m_pConnection;
pCommand->CommandType = adCmdStoredProc;
pCommand->CommandText = _bstr_t("CustomerWithMostRecentOrder");
pRS = pCommand->Execute( &vNull, &vNull, adCmdUnknown );(3)استخدام مجموعة البيانات لتنفيذ احدي الاستعلامات:
_RecordsetPtr pRecordSet;
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
_bstr_t bstrQuery("SELECT * FROM Customers");
pRecordSet.CreateInstance(_uuidof(Recordset));
pRecordSet->PutRefActiveConnection(m_pConnection);
pRecordSet->Open(_variant_t(bstrQuery), vNull,
adOpenForwardOnly, adLockOptimistic, adCmdText);بعد اجراء الاستعلام يمكنك تعديل او حذف او اضافة البيانات وذلك باستخدام مجموعة البيانات كما في الامثلة التالية:
لحذف البيانات:
pRecordSet->Delete(adAffectCurrent);
لتحديث البيانات:
pRecordSet->PutCollect(L"ProductName", L"بيرقر"); pRecordSet->Update(vNull, vNull);
لاضاقة بيانات:
COleSafeArray vaFieldlist;
vaFieldlist.CreateOneDim(VT_VARIANT,3);
long lArrayIndex[1];
lArrayIndex[0] = 0;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t(“PartNumber")));
lArrayIndex[0] = 1;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("ProductName")));
lArrayIndex[0] = 2;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("Price")));
COleSafeArray vaValuelist;
vaValuelist.CreateOneDim(VT_VARIANT,3);
lArrayIndex[0] = 0;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("104")));
lArrayIndex[0] = 1;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("بيرقر")));
lArrayIndex[0] = 2;
vaValuelist.PutElement(lArrayIndex,
&(_variant_t((float)30.95)));
pRecordSet->AddNew(vaFieldlist, vaValuelist);كانت هذه لمحة سريعة عن كيفية استخدام ADO .


