عملية: تنفيذ عملية في مجموعة السجلات (ODBC)

يشرح هذا الموضوع كيفية تنفيذ عملية فى مجموعة السجلات.

ملاحظة

يتم اعتماد مستوى واحد فقط من المعاملات; يتعذر تنفيذ تداخل بين المعاملات.

لتنفيذ عملية في مجموعة سجلات

  1. قم باستدعاء دالة العضو BeginTransالخاصة بالكائن CDatabase .

  2. إذا كنت لم تقم بتطبيق إحضار صفوف كبيرة الحجم ، استدع دوال العضو اضف جديد / طّور "AddNew/Update"، و عّدل / طّور "Edit/Update" و حذف "Delete" الخاصة بواحد أو أكثر من كائنات مجموعة السجلات لنفس قاعدة البيانات العديد من المرات حسب الحاجة. للحصول على مزيد من المعلومات، راجع مجموعة السجلات. إضافة و تحديث و حذف السجلات (ODBC) إذا طبقت جلب الصفوف كبيرة الحجم , يجب كتابة الدالات الخاصة بك لتحديث مصدر البيانات.

  3. وأخيراً، قم باستدعاء دالة العضو CommitTrans الخاصة بالكائن CDatabase. إذا حدث خطأ في أحد التحديثات أو كنت ترغب في إلغاء التغييرات ، استدع دالة العضو Rollback الخاصة به .

يستخدم المثال التالي مجموعتي سجلات لحذف تسجيل الطالب من قاعدة تسجيل خاصة بمدرسة , و إزالة الطالب من كافة الفصول التى سُجل فيها. و لأن استدعاءات Delete فى كلا مجموعتي السجلات يجب أن تنجح ، فإننا نحتاج إلى "عملية". يفرض المثال وجود m_dbStudentReg - و هو متغير عضو من النوع CDatabase- متصلاً بالفعل بمصدر البيانات وفئات مجموعة السجلات CEnrollmentSet و CStudentSet. المتغير strStudentID يحتوي على قيمة تم الحصول عليها من المستخدم.

BOOL CEnrollDoc::RemoveStudent( CString strStudentID )
{
    // remove student from all the classes
    // the student is enrolled in

    if ( !m_dbStudentReg.BeginTrans( ) )
        return FALSE;

    CEnrollmentSet rsEnrollmentSet(&m_dbStudentReg);
    rsEnrollmentSet.m_strFilter = "StudentID = " + strStudentID;

    if ( !rsEnrollmentSet.Open(CRecordset::dynaset) )
        return FALSE;

    CStudentSet rsStudentSet(&m_dbStudentReg);
    rsStudentSet.m_strFilter = "StudentID = " + strStudentID;

    if ( !rsStudentSet.Open(CRecordset::dynaset) )
        return FALSE;

    TRY
    {
        while ( !rsEnrollmentSet.IsEOF( ) )
        {
            rsEnrollmentSet.Delete( );
            rsEnrollmentSet.MoveNext( );
        }

        // delete the student record
        rsStudentSet.Delete( );

        m_dbStudentReg.CommitTrans( );
    }

    CATCH_ALL(e)
    {
        m_dbStudentReg.Rollback( );
        return FALSE;
    }
    END_CATCH_ALL

    rsEnrollmentSet.Close( );
    rsStudentSet.Close( );

    return TRUE;

}

ملاحظة

استدعاء BeginTrans مرة أخرى بدون استدعاء CommitTrans أو Rollback خطأ.

راجع أيضًا:

المرجع

CDatabase أعضاء البيانات

CRecordset أعضاء البيانات

المبادئ

عملية (ODBC)

عملية: كيف تؤثر العمليات على التحديثات (ODBC)