الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برمجة قواعد البيانات باستخدام Ado و لغة C++

مغلق
بدأه garo في 26 ديسمبر 2007 · 9 رد · 7,948 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم....

لقد بحثت كثيرا عن برمجة قواعد البيانات بواسطة لغة السي بلس وقد اليت علي نفسي ان اكتب هذه المشاركة

التي قد ينتفع بها اخوتي محبي البرمجة بلغة السي.

مقدمة :

هنالك الكثير من تقنيات الوصول الي قواعد البيانات (بل جميع التقنيات) التي يمكن التعامل معها بواسطة لغة السي بلس ،

لكني اخترت تقنية 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 .

( _ /)

(='.'=)

(")-(")

#2

لماذا لا يوجد ردود هل الشرح غير واضح ؟

( _ /)

(='.'=)

(")-(")

#3

الموضوع جميل أخي العزيز,

بالنسبة لي لا أعرف من قواعد البيانات إلا اسمها, لذلك أتمنى ألا تكون أسئلتي ثقيلة عليك,

بالنسبة لأنواع البيانات, كيف يتم التوفيق بين أنواع البيانات التي تستخدمها القاعدة مع أنواع البيانات الموجودة في ++C,

بمعنى آخر, هل يتم تحويل أنواع الأعداد على سبيل المثال تلقائياً من و إلى int ؟

تحياتي ,,

#4

شكرا لاهتمامك اخي Khaled.Alshaya

بالنسبة الي موضوع انواع البيانات فهنالك اختلاف بين انواع البيانات التي تستخدمها قاعدة البيانات

مع انواع البيانات التي نستخدمها في السي بلس بلس، لكن لا تهتم لذلك كثيرا فان محرك قاعدة البيانات هو الذي يجري التحويل

بين نوع البيانات المدخلة وبين البيانات التي تخزن كل ماهو مطلوب ان يكون نوع البيانات صحيح فمثلا اذا كان الحقل نصي فيجب ان يتم

ادخال نص (نوع المتغير الذي سوف نستخدمه) كذلك اذا كان الحقل رقمي فيجب ان يكون الادخال رقم وهكذا.

يتم استخدام كائن لارسال البيانات الي قاعدة البيانات (او بصورة اصح الي محرك قاعدة البيانات Database Driver)

هذا الكائن يغلف جميع انواع البيانات المتاحة في السي بلس بلس و يسمي _variant_t

حيث يخبر قاعدة اليانات بنوع البيانات والقيمة (اي البيانات الحقيقة)

_variant_t vnum;
//data type
vNull.vt = VT_INT;
//data
vnum.scode = 35;

تم تعديل هذه المشاركة بواسطة garo في 27 ديسمبر 2007 في 18:12

( _ /)

(='.'=)

(")-(")

#5

تحدثنا هنا سابقا أيضا بشكل سريع عن ذلك :

/index.ph...st&p=237808

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

انا أسف لانني لم ابحث في المنتدي عن موضوع مشابه قبل ان اكتب هذا الموضوع

وسوف اضع ذلك في الاعتبار في مقبل الايام

تم تعديل هذه المشاركة بواسطة garo في 28 ديسمبر 2007 في 13:16

( _ /)

(='.'=)

(")-(")

#7
اقتباس
انا أسف لانني لم ابحث في المنتدي عن موضوع مشابه قبل ان اكتب هذا الموضوع

وسوف اضع ذلك في الاعتبار في مقبل الايام

الأخ هيثم كان يقصد أن هناك مواضيع في المنتدى حول الموضوع أيضاً و لم يكن يقصد أن المنتدى لا يحتاج إلى المزيد :lol:

#8

شكرا لك اخي خالد لتوضيح الامر كنت اظن ان المواضيع المتشابهة يمكن ان تغلق ....

( _ /)

(='.'=)

(")-(")

#9

السلام عليكم ،

ممكن نفس الموضوع بس على قواعد بيانات الـ(mysql) والاوراكل ، وشكرا جزيلا .

#10

مرحبا ..

انا لم اتحدث عن نوع معين من قواعد البيانات بل تحدث عن نوع من التقنيات التي تستخدم في الاتصال بقواعد البيانات جميعها.

لقد ذكرت في موضوعي هذا (عبارة الاتصال) وهي عبارة عن نص يحدد نوع المحرك قاعدة و واسم المستخدم والباسويرد..الخ

يمكنك البحث في مستندات mysql لمعرفة معلومات عن هذه العبارة وكيفية استخدامها في تقنية ado

اذا اتحيت لي معلومات عن كيفية ذلك سوف اكتبه هنا.

( _ /)

(='.'=)

(")-(")

هذا الموضوع مغلق.

مواضيع مشابهة